创建索引后,select 速度反而慢了

MariaDB [hksec]> select count(*) from quote;
count(*)
6119768

1 row in set (5.12 sec)

MariaDB [hksec]> select count(distinct code) from quote;
count(distinct code)
1991

1 row in set (23.42 sec)

这个select 很慢,我想建立索引来提高速度

MariaDB [hksec]> alter table quote add index mark(code(6));

Query OK, 0 rows affected (31.47 sec)
Records: 0 Duplicates: 0 Warnings: 0

MariaDB [hksec]> select count(distinct code) from quote;
count(distinct code)
1991

1 row in set (23.61 sec)

反而变慢了

阅读 3.4k
4 个回答

distinct 语句扫的是全表,你加索引有什么区别?

不太懂 sql,但是 23.42 和 23.61,差 1%,应该算在误差里面。

索引只用在where语句之后

  • 因为题主没有给出数据表的存储引擎和表结构等细节,所以也不敢妄加推测优化方法。这里Mysql 中对 distinct 的官方优化技巧,是用了 Group by。题主可以根据自己的实际情况进行优化。
  • 回答一下第一个回答所提出的问题,加不加索引对 distinct 有什么影响(以 explain 的输出内容为依据):

    • type:没加索引时是 ALLFull Table Scan);加了索引是 IndexFull Index Scan);
    • Extra:没加索引时是 Using temporary;加了索引是 Using index
    • 以上两点的区别无需赘述了吧,再深入的话,还会涉及到存储引擎对数据页和索引的缓存问题。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题