• 重庆“轮椅教师”高位截瘫仍坚守讲台 2019-07-07
  • 百度车联网携手宝马 合作伙伴全面升级为国际OEM厂商 2019-07-01
  • 全面从严治党永远在路上——辽宁代表团开放日侧记 2019-07-01
  • 【学习时刻】华侨大学黄日涵:“一带一路”盛会开启合作发展新篇章 2019-06-24
  • 秒变迷弟!吴建豪晒与甄子丹合影:偶像给我签名 2019-06-20
  • 军统头目戴笠留下哪些巨额遗产 令蒋介石身边人惊诧 2019-06-20
  • 初春喝藿香汤 解表化湿,散寒温经 2019-06-18
  • 新华时评:磋商,不等于反复折腾 2019-06-09
  • 天山特克斯峡谷 中国国家地理网 2019-06-08
  • 端午小长假珠海口岸将迎双向客流高峰 2019-06-08
  • 王朝崩塌!恒大半个月内双线出局 卡帅敲响下课警钟 2019-06-07
  • 一周人事:国务院发布任免刘伟当选北京市总工会主席 2019-06-07
  • 敞篷式设计 日产聆风Open Car官图发布 2019-06-06
  • 习近平为传统文化“代言” 2019-06-05
  • 奋力谱写新时代追赶超越新篇章——访陕西省委书记胡和平 2019-06-04
  • 香港赛马会第56期图:MySQL组合索引与最左匹配原则详解

    香港赛马会网站惠泽社绝杀八码 www.mwcrz.tw  更新时间:2019年03月16日 11:17:35   作者:Wolf、Heart   我要评论

    这篇文章主要给大家介绍了关于MySQL组合索引与最左匹配原则的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    前言

    之前在网上看到过很多关于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

    填充100w测试数据

    DROP PROCEDURE pro10;
    CREATE PROCEDURE pro10()
    BEGIN
    	DECLARE i INT;
    	DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    	DECLARE return_str varchar(255) DEFAULT '';
    	DECLARE age INT;
    	SET i = 1;
    	WHILE i < 5000000 do
    		SET 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;

    可以看到该查询没有使用到索引,类型为index,查询行数为4989449,几乎进行了全表扫描,由于组合索引只针对最左边的列进行了排序,对于name、age只能进行全部扫描

    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;

    可以看到如上查询也使用到了索引,id放前面和放后面查询到的结果是一样的,MySQL会找出执行效率最高的一种查询方式,就是先根据id进行查询

    总结

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

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

    相关文章

    最新评论

  • 重庆“轮椅教师”高位截瘫仍坚守讲台 2019-07-07
  • 百度车联网携手宝马 合作伙伴全面升级为国际OEM厂商 2019-07-01
  • 全面从严治党永远在路上——辽宁代表团开放日侧记 2019-07-01
  • 【学习时刻】华侨大学黄日涵:“一带一路”盛会开启合作发展新篇章 2019-06-24
  • 秒变迷弟!吴建豪晒与甄子丹合影:偶像给我签名 2019-06-20
  • 军统头目戴笠留下哪些巨额遗产 令蒋介石身边人惊诧 2019-06-20
  • 初春喝藿香汤 解表化湿,散寒温经 2019-06-18
  • 新华时评:磋商,不等于反复折腾 2019-06-09
  • 天山特克斯峡谷 中国国家地理网 2019-06-08
  • 端午小长假珠海口岸将迎双向客流高峰 2019-06-08
  • 王朝崩塌!恒大半个月内双线出局 卡帅敲响下课警钟 2019-06-07
  • 一周人事:国务院发布任免刘伟当选北京市总工会主席 2019-06-07
  • 敞篷式设计 日产聆风Open Car官图发布 2019-06-06
  • 习近平为传统文化“代言” 2019-06-05
  • 奋力谱写新时代追赶超越新篇章——访陕西省委书记胡和平 2019-06-04
  • 上海上港武磊年薪多少 福利彩票网 乐透转轮在线客服 河南福彩一幸运武林走势图 内倍透码网站 波尔多庄园 斯图加特朱婷 歌剧魅影客服 澳客网数据采集 广州恒大vs浦和红钻上半场