我有一个小问题:
如果我有三个查询:
1. SELECT * FROM table WHERE col1=3 AND col2=4 WHERE col3 > 15 ORDER BY col3 ASC
2. SELECT * FROM table WHERE col1=3 AND col2=4 ORDER BY col3 ASC
3. SELECT * FROM table WHERE col1=3 AND col2=4 AND MATCH ( col6 ) AGAINST ( "text" ) ORDER BY col3 ASC
索引表的正确顺序是什么?
我的猜测:
1. col1, col2, col3
2. col1, col2, col3
3. col1, col2, col6, col3
我错了吗?
LE
我添加索引后,为1:
CREATE INDEX idx ON table ( col1, col2, col3 )
查询是:
EXPLAIN SELECT * FROM table IGNORE INDEX ( idx ) WHERE col1 = 5 AND col2 = 5 AND col3 > 56000 ORDER BY col3 ASC
rows: 100306
EXPLAIN SELECT * FROM table USE INDEX ( idx ) WHERE col1 = 5 AND col2 = 5 AND col3 > 56000 ORDER BY col3 ASC
rows: 100306
所有行都是使用:
生成的$arr = array( );
for( $i = 0; $i < 100000; $i++ )
$arr[ intval( $i ) ] = intval( $i );
shuffle( $arr );
for( $i = 0; $i < 100000; $i++ )
{
$jud = $i % 10;
$or = 10 - ( $i % 10 );
$db_request = $db->prepare( "INSERT INTO table ( col1, col2, col3 ) VALUES ( '$jud', '$or', '".$arr[ $i ]."' )" );
$db_request->execute( array( ) );
}
在possible_keys上显示索引,但在Extra时,它不是说&#34;使用索引&#34;
那么,出了什么问题?
答案 0 :(得分:1)
MATCH()
用于全文索引。它不能使用普通类型的索引。您需要创建全文类型的单独索引:
ALTER TABLE `table` ADD FULLTEXT INDEX (col6);
除此之外,你对col1,col2,col3的索引是正确的。
您可能会喜欢我的演示文稿How to Design Indexes, Really。
如果您在EXPLAIN报告的key
列中看到该索引,则该查询会使用该索引。
&#34;使用索引&#34;真的意味着&#34;仅使用 索引。&#34;换句话说,它能够使用索引进行搜索和排序,和索引包含select-list所需的所有列,因此它不需要查找在桌子上排成一排。当发生这种情况时,它被称为仅索引查询,索引有时被称为&#34;覆盖索引。&#34;
如果您使用SELECT *
,通常无法获得&#34;使用索引&#34;除非您的索引包含该表的所有列。
你也看不到&#34;使用索引&#34;如果查询跳过索引并执行表扫描,或者使用的索引是PRIMARY KEY索引。
答案 1 :(得分:0)
给出的索引顺序最有效。
1. col1, col2, col3
2. col1, col2, col3
3. col1, col2, col6, col3