前言

之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。

什么时候创建组合索引?

当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引

为什么不对没一列创建索引

  • 减少开销
  • 覆盖索引
  • 效率高

减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引
覆盖索引:假如查询SELECT col1, col2, col3 FROM 表名,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询

效率高:对col1、col2、col3三列分别创建索引,MySQL只会选择辨识度高的一列作为索引。假设有100w的数据,一个索引筛选出10%的数据,那么可以筛选出10w的数据;对于组合索引而言,可以筛选出100w*10%*10%*10%=1000条数据

最左匹配原则

假设我们创建(col1,col2,col3)这样的一个组合索引,那么相当于对col1列进行排序,也就是我们创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引

创建测试表

CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar(10) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `idx_id_name_age` (`id`,`name`,`age`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
DROP PROCEDURE pro10;CREATE PROCEDURE pro10()BEGINDECLARE i INT;DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';DECLARE return_str varchar(255) DEFAULT '';DECLARE age INT;SET i = 1;WHILE i < 5000000 doSET return_str = substring(char_str, FLOOR(1 + RAND()*62), 8);SET i = i+1;SET age = FLOOR(RAND() * 100);INSERT INTO student(id, name, age) values(i, return_str, age);END WHILE;END;CALL pro10();
EXPLAIN SELECT * FROM student WHERE id = 2;
EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk';
EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8;
EXPLAIN SELECT * FROM student WHERE id = 2 AND age = 8;
EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND age = 8;
EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND id = 2;EXPLAIN SELECT * FROM student WHERE age = 8 AND id = 2;EXPLAIN SELECT * FROM student WHERE name = 'defghijk' and age = 8 AND id = 2;

总结

如上测试,可以看到只要查询条件的列中包含组合索引最左边的那一列,不管该列在查询条件中的位置,都会使用索引进行查询。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Android(安卓)- Manifest 文件 详解
  3. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  4. Selector、shape详解(一)
  5. android2.2资源文件详解4--menu文件夹下的菜单定义
  6. Android发送短信方法实例详解
  7. Android(安卓)读取资源文件实例详解
  8. 详解Android中的屏幕方向
  9. Android(安卓)通用标题栏之组合控件

随机推荐

  1. Android矢量动画-VectorDrawable
  2. Android studio3.6的JNI教程之helloworld
  3. android 使用TextView/EditText应该注意
  4. TextView字间距和行间距设置
  5. 使用AIDL实现Android的跨进程通信
  6. android checkbox,radiobox style自定义
  7. Phone拨号调起InCallUi流程(Phone 9.0 )(P
  8. 基于Android(安卓)XML解析与保存的实现
  9. Android Drawable Importer的使用
  10. Android中判断字符串中必须包含字母或者