mysql - 哪个复合索引会使这个简单的 MySQL 查询更快?

标签 mysql indexing query-optimization composite-index

哪个复合索引会使这个简单的 MySQL 查询更快,我将如何创建该复合索引?

SELECT * 
FROM  `Table1` 
WHERE  `col1` =  '145307'
AND  `col2` =  '0'
AND col3 NOT 
IN ( 130209, 130839 ) 
ORDER BY col4 DESC 
LIMIT 0 , 5

上面的每一列(col1col4)已经有一个单独的索引。


编辑:

SHOW CREATE TABLE 的结果:

CREATE TABLE `Table1` (  
 `primaryCol` int(11) NOT NULL AUTO_INCREMENT,
 `col3` int(11) DEFAULT '0',
 `col5` varchar(20) COLLATE utf8_bin DEFAULT NULL,
 `col1` int(11) DEFAULT '0',
 `col6` varchar(80) COLLATE utf8_bin DEFAULT NULL,
 `col7` text CHARACTER SET utf8,
 `col4` int(11) DEFAULT '0',
 `col8` char(1) COLLATE utf8_bin DEFAULT 'N',
 `col9` char(1) COLLATE utf8_bin DEFAULT 'N',
 `col2` tinyint(1) NOT NULL,
 `col10` tinyint(1) NOT NULL,
 `col11` smallint(6) NOT NULL,
 PRIMARY KEY (`primaryCol`),
 KEY `col5` (`col5`),
 KEY `col1` (`col1`),
 KEY `col3` (`col3`),
 KEY `col4` (`col4`),
 KEY `col8` (`col8`),
 KEY `col9` (`col9`),
 KEY `CompIndex1` (`col1`,`col8`,`col4`),
 KEY `col2` (`col2`),
 KEY `col10` (`col10`),
 KEY `col11` (`col11`),
 FULLTEXT KEY `col7` (`col7`)
) ENGINE=MyISAM AUTO_INCREMENT=4575350 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

EXPLAIN EXTENDED 的结果:

id  select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  Table1  ref col1,col3,CompIndex1,col2   CompIndex1  5   const   226 100 Using where; Using filesort

最佳答案

我建议在 (col1, col2, col3) 上建立索引。

mysql> CREATE INDEX NewIndex ON Table1 (col1,col2,col3);

mysql> EXPLAIN SELECT *  FROM  `Table1`  WHERE  `col1` =  '145307' 
AND  `col2` =  '0' AND col3 NOT  IN ( 130209, 130839 )  
ORDER BY col4 DESC  LIMIT 0 , 5\G

           id: 1
  select_type: SIMPLE
        table: Table1
         type: ref
possible_keys: col1,col3,CompIndex1,col2,NewIndex
          key: NewIndex
      key_len: 6
          ref: const,const
         rows: 1
        Extra: Using where; Using filesort

您在 col3 上的条件不是相等比较,而是范围比较,它应该是索引中的最后一列。

不幸的是,这意味着您无法摆脱 EXPLAIN 计划中的“using filesort”。通常,如果您还在不同的列上进行范围比较,则无法使用索引优化排序。

但是您至少可以使用三列索引来缩小搜索范围,这样文件排序就必须对较小的行集进行处理,然后它可能能够在内存中进行处理。

另请参阅我的演示文稿 How to Design Indexes, Really .

关于mysql - 哪个复合索引会使这个简单的 MySQL 查询更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13847137/

相关文章:

java - 如何从外部类内部调用对象数组列表方法

Solrcloud 副本在更新后立即进入恢复模式

sql-server - SQL Server 2005 T-SQL 问题 : Can you trust the Query Optimizer ? 我知道我不能!

PostgreSQL - 为什么对大型数据集的一些查询如此缓慢

PHP 需要返回代码

mysql - 将计数查询转换为 CakePHP 中包含语句中的列表

mysql - INSERT ON DUPLICATE KEY 和 UPDATE 后记录数据

jquery - 如何在jquery中选择selectedIndex的id

MySQL InnoDB 表损坏——如何修复?

sql - 关于如何替换MariaDB语句中的UNION子句的思考