17
回答
mysql,为什么加索引比不加索引慢呢?我就不明白了
注册华为云得mate10,2.9折抢先购!>>>   

表数据量246w条记录;

表结构

数据形式大概为:

张学友 z zxy

想通过姓名的首字母执行查询,语句为:

select * from emp_contact where py_idx='z' and name_py like 'z%';

我在py_idx上建立了索引,执行分析为:

语句的执行时间(use show profiles)

执行了10次,平均时间大概为2.64秒

随后我去掉py_idx上的索引,

执行时间:

执行了10次,平均时间大概为2.0秒

到此我就不明白了,为啥加上索引后,检索的记录少了,为啥执行时间反而多了?

请高手指教一下,问题在哪里?

举报
恺哥
发帖于6年前 17回/6K+阅
共有17个答案 最后回答: 6年前
py_idx保存的是a-z也就是名字的首字母吗? 这样的对数据重复率高的字段加索引没有多少效果的。

我觉得最好是改为对name_py加索引,如果用不了全部索引的话,也可以只索引这个字段最开始的子部分。

py_idx 类型为 char(1) ,里边就存放单一字符

name_py是varchar(10),里边存放姓名的首字母

我是使用混合索引

刚刚做了如下的实验:

首先增加了一个组合索引,里边是py_idx和name_py,执行时间3.5秒左右

随后,我删掉所有索引,只建立name_py,遗憾的是这个索引实际并没有用上,所以执行时间反而快,2.1左右;

再之后,我建立了连个独立的所以,一个是py_idx,另一个是name_py,这样的话,实际起作用的仅是py_idx,所以执行时间大约在2.6秒左右

之所以有这样的结果,是不是因为like的原因?

呵呵,看来跟like没什么关系,我索性把sql修改了一下,像这样:

select * from emp_contact where py_idx='z'

然后我再py_idx建立了索引,平均时间为2.6秒

去掉索引,反而是在2.0秒

这到底是为啥?为啥?为啥啊?

引用来自“大东哥”的答案

多出来的时间是,磁盘IO.

索引是提高查询速度的

加了索引范围查询效率下降

解释不了啊

--- 共有 1 条评论 ---
大东哥索引利用得当是提高查询速度,但你这情况,反而多出了磁盘IO哦。 6年前 回复

字段区分度不够.

索引其实是单独的问题,引擎先去找索引,然后根据索引上的指针去找数据.

如果索引效率本身不高,那就是额外的消耗了

顶部