老师有个问题,关于创建索引
来源:8-6 【实战】如何选择索引键的顺序

帅的被狗撵
2021-01-04
SELECT `id`,`title`,`thumb` FROM `tp_news` WHERE `status` = 1 AND `hot` = 1 AND `recommend` = 1 LIMIT 20;
这个sql语句
status:状态,值有0,1,-1
hot:是否热门,值有0,1
recommend:是否推荐,值有0,1
下面是这个表的索引
PRIMARY KEY (`id`),
KEY `status_hot_rec` (`status`,`hot`,`recommend`) USING BTREE
这是建立索引后的sql执行计划
mysql> explain SELECT `id`,`title`,`thumb` FROM `tp_news` WHERE `status` = 1 AND `hot` = 1 AND `recommend` = 1 LIMIT 20;
+----+-------------+-------+------------+------+--------------------+--------------------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+--------------------+--------------------+---------+-------+------+----------+-----------------------+
| 1 | SIMPLE | tp_news | NULL | ref | status_hot_rec | status_hot_rec | 1 | const | 8677 | 1.00 | Using index condition |
+----+-------------+-------+------------+------+--------------------+--------------------+---------+-------+------+----------+-----------------------+
这是没有建立索引的sql执行计划
mysql> explain SELECT `id`,`title`,`thumb` FROM `tp_news` WHERE `status` = 1 AND `hot` = 1 AND `recommend` = 1 LIMIT 20;
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+-------------+
| 1 | SIMPLE | tp_news | NULL | ALL | NULL | NULL | NULL | NULL | 17354 | 0.10 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+-------------+
对比发现
增加索引后rows 少了差不多50%
但是filtered才只有1,是不是太少了
我这样建立的索引是否合理呢?
请老师指导一二。谢谢!!
写回答
1回答
-
sqlercn
2021-01-04
你这个表的status,hot和recommend三个字段的筛选性都不是太好,也就是说唯一值太少了。所以在这三列上建立索引起到的效果也就并不明显。如果recommend的值中0占绝大多数,recommend=1的数据行很少的话,可以在recommend上建立一个索引。这样当然询recommend=1的数据时索引的性能会好很多。
00
相似问题
请教老师关于联合索引的问题
回答 1
主键、约束、索引区别
回答 1