使用where子句进行MySQL索引

时间:2018-02-09 17:38:11

标签: mysql indexing

我有一个小问题:

如果我有三个查询:

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;

那么,出了什么问题?

2 个答案:

答案 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