这个SQL怎么能用上索引呀?

yzxlyd 2009-07-07 11:37:34
SELECT * FROM a WHERE id IN (2,4,5) AND is_delete=0 ORDER BY dateline_start DESC LIMIT 0, 5
id是主键,如果没有order by 语句这个索引可以用得上,加上order by 就用不上了。
我为id和dateline_start加上联合索引也用不上。请各位指点指点!!非常感谢!!
...全文
10 点赞 收藏 13
写回复
13 条回复
WWWWA 2009年07月10日
就是要取舍,看看哪些条件下记录要多一些。
回复 点赞
ACMAIN_CHM 2009年07月10日

建议你能回答一下那三个问题。is delete 如果需要那就建一个索引以提高效率,但前提是要知道第二个问题的答案。

表中记录总数 9,000,000

1。 id IN (2,4,5) , 这个in 后会有多少?10个,20个,100个?500个?
A: 5000

2。is_delete=0 ,在表中所有记录中所占比例?表中10% 的记录? 20% 的记录?...

3。 dateline_start,在表中相同的dateline_start的机率是多少?是不是几乎没有记录相同的 dateline_start ?或者最多dateline_start相同的记录不超过3个?
回复 点赞
yzxlyd 2009年07月10日
这个表的记录可能是几百万,id in ()这里面有可能是5千,is_delete没有索引。
回复 点赞
ACMAIN_CHM 2009年07月10日

那主要需要考虑以下几个问题。

1。 id IN (2,4,5) , 这个in 后会有多少?10个,20个,100个?500个?
2。is_delete=0 ,在表中所有记录中所占比例?表中10% 的记录? 20% 的记录?...
3。 dateline_start,在表中相同的dateline_start的机率是多少?是不是几乎没有记录相同的 dateline_start ?或者最多dateline_start相同的记录不超过3个?
回复 点赞
yzxlyd 2009年07月10日
id等于2,4,5只是举例,实际情况可能有很多。现在数据还比较少,所以执行的时间不是很准确。
回复 点赞
yzxlyd 2009年07月07日
mysql> show index from a;
+--------------------+------------+-------------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------------+------------+-------------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| a | 0 | PRIMARY | 1 | id | A | 2 | NULL | NULL | | BTREE | |
| a | 1 | kid_start | 1 | kid | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | kid_start | 2 | dateline_start | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | kid_cate_start | 1 | kid | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | kid_cate_start | 2 | category | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | kid_cate_start | 3 | dateline_start | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | category_dateline | 1 | category | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | category_dateline | 2 | dateline | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | dateline | 1 | dateline | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | group_id | 1 | group_id | A | 2 | NULL | NULL | YES | BTREE | |
| a | 1 | dateline_start | 1 | id | A | 2 | NULL | NULL | | BTREE | |
| a | 1 | dateline_start | 2 | dateline_start | A | 2 | NULL | NULL | YES | BTREE | |
+--------------------+------------+-------------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
回复 点赞
yzxlyd 2009年07月07日
这是explain的结果。mysql的版本是4
mysql> explain SELECT * FROM a WHERE id IN (1,4) ORDER BY dateline_start DESC LIMIT 0, 5;
+----+-------------+--------------------+-------+------------------------+---------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+-------+------------------------+---------+---------+------+------+-----------------------------+
| 1 | SIMPLE | a | range | PRIMARY,dateline_start | PRIMARY | 4 | NULL | 2 | Using where; Using filesort |
+----+-------------+--------------------+-------+------------------------+---------+---------+------+------+-----------------------------+
回复 点赞
wwwwb 2009年07月07日
优化是比较头疼的问题,要有耐心,慢慢调试
回复 点赞
ljf_ljf 2009年07月07日
楼主 你如何看出没有使用索引呢?请讲讲你的依据。
回复 点赞
WWWWA 2009年07月07日
explain sql语句,贴结果
回复 点赞
WWWWA 2009年07月07日
SHOW INDEX FROM tbl_name
贴结果
在dateline_start、ID建立复合索引试试
回复 点赞
ACMAIN_CHM 2009年07月07日

SELECT * FROM a
WHERE id IN (2,4,5)
AND is_delete=0
ORDER BY
dateline_start DESC LIMIT 0, 5

你的语句比较奇怪,按理说这个语句的执行速度应该很快啊。
你的id 在表中是主键, 所以无论换成任何人,都会先从主键中查询id IN (2,4,5) ,然后作order by 和 is_delete=0

如果仅是WHERE id IN (2,4,5) , 最多只有三条记录,你的LIMIT 0, 5 也没什么意义啊。

你现在这句的执行时间是多少?

回复 点赞
发动态
发帖子
MySQL
创建于2007-09-28

2.4w+

社区成员

5.5w+

社区内容

MySQL相关内容讨论专区
社区公告
暂无公告