MySQL:了解WHERE子句应用模式

时间:2014-06-05 08:49:01

标签: mysql sql

我正在阅读High Performance MySQL

我想了解:以下短语

  

一般来说,MySQL可以通过三种方式应用WHERE子句,从最好到   最坏的:

     
      
  1. 将条件应用于索引查找操作以消除不匹配的行。这发生在存储引擎层。
  2.   
  3. 使用覆盖索引(Extra列中的“Using index”)来避免行访问,并在检索每个行后过滤掉不匹配的行   索引的结果。这发生在服务器层,但它   不需要从表中读取行。
  4.   
  5. 从表中检索行,然后过滤不匹配的行(Extra栏中的“Using where”)。这发生在服务器层和   要求服务器在可以过滤之前从表中读取行   它们。
  6.   

我的理解:假设我有

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, ...)
  • 第3个案例: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. 我们在哪里得到第二个案例?

1 个答案:

答案 0 :(得分:1)

第一种情况:PK查找。需要Ne解释

您的问题:

1:索引查找。 Mysql将评估索引(在它看来)是否比全表扫描快,并且会这样做。如果索引中的值是不同的(即使没有由唯一约束强制执行),也可以像第一种情况一样快

2:MySQL将检查哪个索引(在它看来)更好的情况并使用它。 MySQL每个join / where子句只能使用一个索引。如果你在field1和field2上有一个索引(即索引(filed1,field2)),它就会使用那个。