老师有个问题,关于创建索引

来源: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的数据时索引的性能会好很多。

0
0

零基础入门 详解企业主流数据库MySQL8.0

掌握SQL优化与慢查询优化,具备独当一面的能力

1641 学习 · 485 问题

查看课程