请教 MySQL 中的复合索引

OSC老司机 发布于 2012/03/03 22:14
阅读 1K+
收藏 2

现在有一张 my_article 表,数据 60W

当浏览一张内容页时,需要通过

SELECT id, title FROM my_article WHERE id > 599868 AND status > 0 AND cid = 2 ORDER BY id ASC LIMIT 1
SELECT id, title FROM my_article WHERE id < 599868 AND status > 0 AND cid = 2 ORDER BY id DESC LIMIT 1

调用上下文,但查询速度好慢,大概需要2秒种, cid 和 status 已经分别做过索引。

我现在还做了一个 cid与status的复合索引,请看图

但查询依然需要 2秒左右

以下是问题补充:

@OSC老司机:删除复合cidstatus后 , 使用 SELECT * FROM my_article WHERE id > 599868 AND status > 0 AND cid = 2 ORDER BY id ASC LIMIT 1 查询竟然才0.009秒 是不是 指定查询字段(id, title)后不可以使用索引啊 MySQL 5.1.13 (2012/03/03 22:19)
加载中
0
OSC老司机
OSC老司机

指定需要的字段查询真的伤不起

0
红薯
红薯
你可以对你的SQL语句用 EXPLAIN 命令查看一下索引是否用上
0
红薯
红薯
一般你的 id 是主键,cid 建了索引,status 无需再建索引,因为 status 的值应该没几个,效果不大
OSC老司机
OSC老司机
哦 status 为 tiny3 ,一般都是 1 或者 -1
0
mark35
mark35
mysql对索引的规划使用比较差,如果是多条件那么基本上只会使用主键索引,即便你其他条件字段也有索引
0
mark35
mark35
楼主可以试试看(cid, id)的复合索引
0
RickyFeng
RickyFeng
索引对>这样的操作符作用不大,  《高性能MySQL(第2版)》有讲过相关的优化
RickyFeng
RickyFeng
@chengtech : where内的条件先后有差别 status > 0 AND cid = 2 改为 cid = 2 and status > 0 会更好
OSC老司机
OSC老司机
不用 > ,那我该如何实现这个功能呢
0
摩摩
where语句的查询改为cid=2 and status>0 and id>599868,然后删掉单个的索引,加上(cid,status)的复合索引试试看。性能的调试一般用explain慢慢摸索。另外楼主调试时否把sql cache关掉了?
返回顶部
顶部