簡體   English   中英

MySQL:了解WHERE子句的應用方式

[英]MySQL: understanding WHERE clause applying modes

我正在閱讀高性能MySQL

我想了解:下面的短語

通常,MySQL可以通過三種方式(從最佳到最差)應用WHERE子句:

  1. 將條件應用於索引查找操作以消除不匹配的行。 這發生在存儲引擎層。
  2. 使用覆蓋索引(“額外”列中的“使用索引”)避免行訪問,並在從索引中檢索每個結果之后過濾掉不匹配的行。 這發生在服務器層,但不需要從表中讀取行。
  3. 從表中檢索行,然后過濾不匹配的行(“額外”列中的“在何處使用”)。 這發生在服務器層,需要服務器從表中讀取行才能對其進行過濾。

我的理解:假設我有

table
|-id     <- PK
|-field1 <- 1st B-Tree index
|-field2 <- 2nd B-Tree index
|-field3 <- not indexed
  • 第一種情況: SELECT field1 FROM table WHERE id IN (@id1, @id2, ...) 1 SELECT field1 FROM table WHERE id IN (@id1, @id2, ...)
  • 第三種情況: SELECT * FROM table WHERE field3 = 'blabla'

問題:我不明白第二種情況。

*問題: 接下來的查詢屬於哪種情況?

  1. SELECT field1, field2 FROM table WHERE field1 = 'blabla'
  2. SELECT field1 FROM table WHERE field1 = 'blabla' AND field2 = 'blabla'
  3. 我們在哪里得到第二種情況?

第一種情況:PK查找。 需要新的解釋

你的問題:

1:索引查找。 Mysql將評估索引(它認為)是否比全表掃描更快,並且這樣做。 如果索引中的值是不同的(即使沒有由唯一約束強制執行),則可以和情況一樣快。

2:MySQL會檢查哪種索引(在它看來)對這種情況更好,並使用它。 MySQL的每個join / where子句只能使用一個索引。 如果您在field1和field2上有一個索引(即index(filed1,field2)),它將使用該索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM