加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql联合索引的选择性解析

发布时间:2022-01-16 23:39:09 所属栏目:MySql教程 来源:互联网
导读:本篇内容介绍了mysql联合索引的选择性解析的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 通过下面的实验来探讨下联合索引的使用选择性: 版本:pe
       本篇内容介绍了“mysql联合索引的选择性解析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
 
      通过下面的实验来探讨下联合索引的使用选择性:
 
版本:percona 5.6.27
 
create table test(
 
a int,
 
b int,
 
c int,
 
name varchar(32),
 
PRIMARY key(a),
 
key index_a_b_c(a,b,c)) ENGINE=INNODB
 
insert into test values(1,1,1,3,'leo');
 
insert into test values(2,1,2,1,'mike' );
 
insert into test values(3,1,3,1,'exo' );
 
insert into test values(4,1,2,3,'jhon' );
 
insert into test values(5,1,1,3,'lucy' );
 
insert into test values(6,2,2,3,'leo' );
 
insert into test values(7,3,1,2,'dv' );
 
insert into test values(8,2,1,3,'men' );
 
一:where条件对联合索引的选择性
 
mysql> explain select * from test where a=2;
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref   | rows | Extra |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 5       | const |    2 | NULL  |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-------+
 
mysql> explain select * from test where a=2 and b=1;
 
+----+-------------+-------+------+---------------+-------------+---------+-------------+------+-------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref         | rows | Extra |
 
+----+-------------+-------+------+---------------+-------------+---------+-------------+------+-------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 10      | const,const |    1 | NULL  |
 
+----+-------------+-------+------+---------------+-------------+---------+-------------+------+-------+
 
mysql> explain select * from test where a=2 and b=2 and c=3;
 
+----+-------------+-------+------+---------------+-------------+---------+-------------------+------+-------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref               | rows | Extra |
 
+----+-------------+-------+------+---------------+-------------+---------+-------------------+------+-------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 15      | const,const,const |    1 | NULL  |
 
+----+-------------+-------+------+---------------+-------------+---------+-------------------+------+-------+
 
这三个是正常的使用方法,都走了索引
 
mysql> explain select * from test where a=2 and c=3;
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-----------------------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref   | rows | Extra                 |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-----------------------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 5       | const |    2 | Using index condition |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-----------------------+
 
1 row in set (0.00 sec)
 
如果把b漏掉,同样走了索引
 
mysql> explain select * from test where b=2 and c=3;
 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
 
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
 
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL |    8 | Using where |
 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
 
1 row in set (0.00 sec)
 
mysql> explain select * from test where c=3;
 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
 
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
 
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL |    8 | Using where |
 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
 
如果把a漏掉,则不会走索引
 
结论:必须有联合索引的第一个字段作为wehre条件
 
二:联合索引排序选择性
 
联合索引的排序会按照(a,b,c)的顺序进行排序
 
测试数据在联合索引的排序会是(1,1,3), (1,2,1), (1,2,3), (1,3,1), (2,1,3), (2,2,3), (3,1,2)顺序存储
 
mysql> explain select * from test where a=2 order by b;
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-------------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref   | rows | Extra       |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-------------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 5       | const |    2 | Using where |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-------------+
 
mysql> explain select * from test where a=2 order by c;
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-----------------------------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref   | rows | Extra                       |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-----------------------------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 5       | const |    2 | Using where; Using filesort |
 
+----+-------------+-------+------+---------------+-------------+---------+-------+------+-----------------------------+
 
可以看出第二个Using filesort使用了临时表排序了,效率低。从联合索引的排序就可以知道当指定a的值的时候,这些值会按b的值排序,不是按c的值排序,故order by b不用再filesort排序,反之order by b需要重新排序。
 
所以select * from test where a=2 and b=2 order by c;不会 filesort排序
 
mysql> explain select * from test where a=2 and b=2 order by c;
 
+----+-------------+-------+------+---------------+-------------+---------+-------------+------+-------------+
 
| id | select_type | table | type | possible_keys | key         | key_len | ref         | rows | Extra       |
 
+----+-------------+-------+------+---------------+-------------+---------+-------------+------+-------------+
 
|  1 | SIMPLE      | test  | ref  | index_a_b_c   | index_a_b_c | 10      | const,const |    1 | Using where |
 
+----+-------------+-------+------+---------------+-------------+---------+-------------+------+-------------+
 
结论:当针对联合索引中的某个字段进行排序的时候,最优的方法是有联合索引排序字段之前的字段过滤条件
 
“mysql联合索引的选择性解析”的内容就介绍到这里了,感谢大家的阅读。

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!