首页 新闻 会员 周边 捐助

为什么我加索引之后,速度变慢了

0
悬赏园豆:20 [待解决问题]

疑问,如题

具体是这样的,有一张表,数据有236W行,

SELECT COUNT(*) FROM zt_action;

随后进行无索引搜索read这个字段的值

SELECT * FROM zt_action WHERE `read`='0'

161W数据用时11s

执行EXPLAIN SELECT * FROM zt_action WHERE `read`='0'

加索引CREATE INDEX `read` ON zt_action(`read`)

再次搜索 SELECT * FROM zt_action WHERE `read`='0'

161W数据用时16s, 加SQL_NO_CACHE 关键字也是一样的时间

SELECT SQL_NO_CACHE * FROM zt_action WHERE `read`='0' 161W数据用时16s,

执行EXPLAIN SELECT * FROM zt_action WHERE `read`='0'

表引擎为MyISAM,字符集为utf8,

为什么加索引之后变慢了,不能理解,请求专业人士帮忙分析下原因???

坐在家里晒太阳的主页 坐在家里晒太阳 | 初学一级 | 园豆:117
提问于:2018-01-26 14:10
< >
分享
所有回答(5)
0

在MySQL数据库里为长字段添加索引后查询速度是有可能变慢的。建议使用前缀索引试一试,看看能否改善。

DanBrown | 园豆:1321 (小虾三级) | 2018-01-26 14:46

您好,您这里说得长字段是指什么意思,是长度吗,我的read字段是enum类型的,‘0’ 和 ‘1’ 两个值

支持(0) 反对(0) 坐在家里晒太阳 | 园豆:117 (初学一级) | 2018-01-26 14:48

@坐在家里晒太阳: 我看你Extra 这个字段有点长,不知道会不会有影响,只是猜测.

支持(0) 反对(0) DanBrown | 园豆:1321 (小虾三级) | 2018-01-26 14:51

@DanBrown: 实际上你看到的Extra字段并不是我数据库里的字段,也不是我要查询的字段,而是在select之前加上关键字EXPLAIN,之后,数据库会给你显示一条数据,这条数据相当于是一个查询报告,判断你此次查询是否使用了索引,你可以在你的数据库上试一下这个关键字

支持(0) 反对(0) 坐在家里晒太阳 | 园豆:117 (初学一级) | 2018-01-26 14:54
0

存储中硬盘随机性大。

比如无索引时 块 连续性要好一些,但索引后  随机性波动变大,尤其是机械硬盘  随机  读取 时间累加就会变大。

这就像你读小文件和度大文件一个道理。

花飘水流兮 | 园豆:13617 (专家六级) | 2018-01-26 14:47

感谢回答

支持(0) 反对(0) 坐在家里晒太阳 | 园豆:117 (初学一级) | 2018-01-29 13:05
0

这个要多试几次,随机的不准确。同一条sql不同时间运行,时间都不是一样的,多测几次看平均值合适一点。

ckx0709 | 园豆:414 (菜鸟二级) | 2018-01-26 16:44

感谢回答,还在解决当中

支持(0) 反对(0) 坐在家里晒太阳 | 园豆:117 (初学一级) | 2018-01-29 13:05
0

你把那个地方换成聚集索引再看看呢?

Daniel Cai | 园豆:10424 (专家六级) | 2018-01-26 23:28

是把什么换成聚集索引呢,

支持(0) 反对(0) 坐在家里晒太阳 | 园豆:117 (初学一级) | 2018-01-29 13:04

@坐在家里晒太阳: read

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2018-01-29 13:44

@Daniel Cai: 表引擎为MyISAM,可以建聚集索引吗

支持(0) 反对(0) 坐在家里晒太阳 | 园豆:117 (初学一级) | 2018-01-29 14:21

@坐在家里晒太阳: 不好意思,忘了你是myisam引擎

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2018-01-29 15:43
0

回表问题,你的表字段多并且你用的select * ,这就导致查询索引后还要去表中再找到真是数据,这也是尽量不要用Select * 的原因

洋仔聊编程 | 园豆:202 (菜鸟二级) | 2018-12-28 20:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册