• 在庆祝海南建省办经济特区30周年大会上的讲话 2019-10-07
  • 俄罗斯世界杯F组:球迷风采 2019-09-24
  • 彭于晏廖凡曝姜文“精神洁癖” 2019-09-24
  • 苏州大学研究生支教团网上众筹资助留守儿童 2019-09-23
  • 湖北政务微信排行榜第187期出炉 交警类公号表现亮眼 2019-09-19
  • 【奋斗吧2018】风电检修工——荒原上的“听风者” 2019-08-31
  • 母亲节又送康乃馨?送这样的健康佳品才走心 2019-08-30
  • [酷]此文已经把马克思理论、边际理论、人类需求层次理论、生物学理论、心理学理论、社会管理学理论等理论在哲学层面完美融合了! 2019-08-26
  • 兰芝雪纱修颜气垫隔离霜 2019-07-27
  • “鹊桥”中继星顺利进入使命轨道运行 2019-07-27
  • 超越舆情管理的360度信息决策 2019-07-22
  • 视频陶然居变形记:从路边小饭馆到全国餐饮十强 2019-07-21
  • 防震减灾事业发展的重要理论成果 2019-07-20
  • 珠宝配美人!李冰冰大片衣着性感秀身段 2019-07-20
  • 机器人也能拥有“情商”?这个可以有 2019-07-19
  • 香港赛马会绝杀一肖:MySQL组合索引与最左匹配原则详解

     更新时间:2019年03月16日 11:17:35   作者:Wolf、Heart   我要评论
    这篇文章主要给大家介绍了关于MySQL组合索引与最左匹配原则的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    香港赛马会网站惠泽社绝杀八码 www.mwcrz.tw 前言

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

    总结

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

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

    相关文章

    • Windows下修改mysql的data文件夹存放位置的方法

      Windows下修改mysql的data文件夹存放位置的方法

      这篇文章主要介绍了在Windows下修改mysql的data文件夹存放位置的方法,需要的朋友可以参考下
      2014-03-03
    • MYSQL命令行模式管理MySql的一点心得

      MYSQL命令行模式管理MySql的一点心得

      MYSQL命令行模式管理MySql的一点心得...
      2007-09-09
    • MySql获取某个字段存在于哪个表的sql语句

      MySql获取某个字段存在于哪个表的sql语句

      本文为大家详细介绍下通过MySql查询某个字段所在表是哪一个,具体的sql语句如下,感兴趣的朋友可以参考下,希望对大家有所帮助
      2013-07-07
    • centos 7系统下编译安装 mysql5.7教程

      centos 7系统下编译安装 mysql5.7教程

      因为Mysql5.7的更新特性还是非常多,所以这篇文章就给大家介绍以下在centos上面编译安装mysql5.7的教程。本文给大家介绍的步骤还是相对来说比较详细的,相信对大家具有一定的参考借鉴价值,有需要的朋友们可以参考借鉴,下面来一起看看吧。
      2016-11-11
    • mysql root密码的重设方法(亲测可用)

      mysql root密码的重设方法(亲测可用)

      这篇文章主要介绍了如何重设mysql root密码,需要的朋友可以参考下
      2014-02-02
    • 在Mysql数据库里通过存储过程实现树形的遍历

      在Mysql数据库里通过存储过程实现树形的遍历

      关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现,mysql没有这样的便捷途径,所以MySQL遍历数据表是我们经?;嵊龅降耐吠次侍?,下面给大家介绍在Mysql数据库里通过存储过程实现树形的遍历,一起看看吧
      2016-11-11
    • MySql命令实例汇总

      MySql命令实例汇总

      这篇文章主要介绍了MySql命令,结合实例分析了MySQL数据库的创建、连接及增删改查等各种常用操作的使用方法与相关注意事项,非常具有实用价值,需要的朋友可以参考下
      2015-11-11
    • MySQL中Stmt 预处理提高效率问题的小研究

      MySQL中Stmt 预处理提高效率问题的小研究

      在oracle数据库中,有一个变量绑定的用法,很多人都比较熟悉,可以调高数据库效率,应对高并发等,好吧,这其中并不包括我,当同事问我MySQL中有没有类似的写法时,我是很茫然的,于是就上网查,找到了如下一种写法
      2011-08-08
    • mysql基于正则实现模糊替换字符串的方法分析

      mysql基于正则实现模糊替换字符串的方法分析

      这篇文章主要介绍了mysql基于正则实现模糊替换字符串的方法,结合具体实例对比分析了使用正则实现mysql字符串替换的注意事项与相关操作技巧,需要的朋友可以参考下
      2017-03-03
    • CentOS6.4上使用yum安装mysql

      CentOS6.4上使用yum安装mysql

      这篇文章主要为大家详细介绍了CentOS6.4上使用yum安装mysql图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2016-10-10

    最新评论

  • 在庆祝海南建省办经济特区30周年大会上的讲话 2019-10-07
  • 俄罗斯世界杯F组:球迷风采 2019-09-24
  • 彭于晏廖凡曝姜文“精神洁癖” 2019-09-24
  • 苏州大学研究生支教团网上众筹资助留守儿童 2019-09-23
  • 湖北政务微信排行榜第187期出炉 交警类公号表现亮眼 2019-09-19
  • 【奋斗吧2018】风电检修工——荒原上的“听风者” 2019-08-31
  • 母亲节又送康乃馨?送这样的健康佳品才走心 2019-08-30
  • [酷]此文已经把马克思理论、边际理论、人类需求层次理论、生物学理论、心理学理论、社会管理学理论等理论在哲学层面完美融合了! 2019-08-26
  • 兰芝雪纱修颜气垫隔离霜 2019-07-27
  • “鹊桥”中继星顺利进入使命轨道运行 2019-07-27
  • 超越舆情管理的360度信息决策 2019-07-22
  • 视频陶然居变形记:从路边小饭馆到全国餐饮十强 2019-07-21
  • 防震减灾事业发展的重要理论成果 2019-07-20
  • 珠宝配美人!李冰冰大片衣着性感秀身段 2019-07-20
  • 机器人也能拥有“情商”?这个可以有 2019-07-19
  • 时时彩后三五胆 北京pk10直播官方网站 重庆时时彩杀胆 在线计划网站 850通比牛牛作弊手法 重庆肘时彩开奖结果 8码复式组三是多少钱 体育比赛即时比分 重庆时时稳定计划app下载 玩pc28方法与技巧