我正在阅读High Performance MySQL。
我想了解:以下短语
一般来说,MySQL可以通过三种方式应用WHERE子句,从最好到 最坏的:
- 将条件应用于索引查找操作以消除不匹配的行。这发生在存储引擎层。
- 使用覆盖索引(Extra列中的“Using index”)来避免行访问,并在检索每个行后过滤掉不匹配的行 索引的结果。这发生在服务器层,但它 不需要从表中读取行。
- 从表中检索行,然后过滤不匹配的行(Extra栏中的“Using where”)。这发生在服务器层和 要求服务器在可以过滤之前从表中读取行 它们。
醇>
我的理解:假设我有
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, ...)
SELECT * FROM table WHERE field3 = 'blabla'
问题:我不明白我们在哪里得到第二个案例。
*问题: 下一个查询属于哪些案例?
SELECT field1, field2 FROM table WHERE field1 = 'blabla'
SELECT field1 FROM table WHERE field1 = 'blabla' AND field2 = 'blabla'
答案 0 :(得分:1)
第一种情况:PK查找。需要Ne解释
您的问题:
1:索引查找。 Mysql将评估索引(在它看来)是否比全表扫描快,并且会这样做。如果索引中的值是不同的(即使没有由唯一约束强制执行),也可以像第一种情况一样快
2:MySQL将检查哪个索引(在它看来)更好的情况并使用它。 MySQL每个join / where子句只能使用一个索引。如果你在field1和field2上有一个索引(即索引(filed1,field2)),它就会使用那个。