疑问,如题
具体是这样的,有一张表,数据有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,
为什么加索引之后变慢了,不能理解,请求专业人士帮忙分析下原因???
在MySQL数据库里为长字段添加索引后查询速度是有可能变慢的。建议使用前缀索引试一试,看看能否改善。
您好,您这里说得长字段是指什么意思,是长度吗,我的read字段是enum类型的,‘0’ 和 ‘1’ 两个值
@坐在家里晒太阳: 我看你Extra 这个字段有点长,不知道会不会有影响,只是猜测.
@DanBrown: 实际上你看到的Extra字段并不是我数据库里的字段,也不是我要查询的字段,而是在select之前加上关键字EXPLAIN,之后,数据库会给你显示一条数据,这条数据相当于是一个查询报告,判断你此次查询是否使用了索引,你可以在你的数据库上试一下这个关键字
存储中硬盘随机性大。
比如无索引时 块 连续性要好一些,但索引后 随机性波动变大,尤其是机械硬盘 随机 读取 时间累加就会变大。
这就像你读小文件和度大文件一个道理。
感谢回答
这个要多试几次,随机的不准确。同一条sql不同时间运行,时间都不是一样的,多测几次看平均值合适一点。
感谢回答,还在解决当中
你把那个地方换成聚集索引再看看呢?
是把什么换成聚集索引呢,
@坐在家里晒太阳: read
@Daniel Cai: 表引擎为MyISAM,可以建聚集索引吗
@坐在家里晒太阳: 不好意思,忘了你是myisam引擎
回表问题,你的表字段多并且你用的select * ,这就导致查询索引后还要去表中再找到真是数据,这也是尽量不要用Select * 的原因