mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要,

只需要知道结果,既然是索引那这个数据结构最后是排好序;就像新华字典他的目录就是按照a,b,c..这样排好序的;

所以你在找东西的时候才快,比如你找 “中” 这个字的解释,你肯定就会定位到目录的 z 开头部分;

组合索引可以这样理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的;

组合索引的生效原则是  从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;

比如

where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;

where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果

where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;

where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关

(a,b,c) 三个列上加了联合索引(是联合索引 不是在每个列上单独加索引)

还需注意,  (a,b,c)多列索引和 (a,c,b)是不一样的,看上面的图也看得出来关系顺序是不一样的;

分析几个实际例子来加强理解;

分析句子中使用的索引情况

(0) select * from mytable where a=3 and b=5 and c=4;

abc三个索引都在where条件里面用到了,而且都发挥了作用

(1) select * from mytable where c=4 and b=6 and a=3;

这条语句列出来只想说明 mysql没有那么笨,where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样

(2) select * from mytable where a=3 and c=7;

a用到索引,b没有用,所以c是没有用到索引效果的

(3) select * from mytable where a=3 and b>7 and c=3;

a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引

(4) select * from mytable where b=3 and c=4;

因为a索引没有使用,所以这里 bc都没有用上索引效果

(5) select * from mytable where a>4 and b=7 and c=9;

a用到了 b没有使用,c没有使用

(6) select * from mytable where a=3 order by b;

a用到了索引,b在结果排序中也用到了索引的效果,前面说了,a下面任意一段的b是排好序的

(7) select * from mytable where a=3 order by c;

a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort

(8) select * from mytable where b=3 order by a;

b没有用到索引,排序中a也没有发挥索引效果

补充一个:

快速生成1000W测试数据库;

创建测试表:

create table user (

id int(10) not null auto_increment,

uname varchar(20) ,

regtime char(30) ,

age int(11) ,

primary key (id)

)

engine=myisam default charset=utf8 collate=utf8_general_ci ,

auto_increment=1 ;

编写存储过程:

delimiter $$

SET AUTOCOMMIT = 0$$

create procedure test()

begin

declare v_cnt decimal (10) default 0 ;

dd:loop

insert into user values

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50),

(null,rand()*10,now(),rand()*50);

commit;

set v_cnt = v_cnt+10 ;

if v_cnt = 10000000 then leave dd;

end if;

end loop dd ;

end;$$

delimiter ;

调用存储过程:

call test();

c mysql 索引_MySQL 多列索引的生效规则相关推荐

  1. mysql三个字段最优索引_mysql 多列索引优化

    Mysql所有的列都可以使用索引,.对相关列使用索引是提高SELECT操作性能的最佳途径.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少256字 ...

  2. mysql 中文列索引_MYSQL多列索引

    大家讲道理2017-04-17 11:38:122楼 1 对mysql来说, : http://dev.mysql.com/doc/refman/5.7/en/create-index.html An ...

  3. mysql 3列索引_mysql多列索引

    1,数据库每次查询只能使用一个索引 2,假设数据 表T (a,b,c) rowid 为物理位置 rowid a b c (1) 1 1 1 (2) 2 1 13 (3) 2 2 14 (4) 1 3  ...

  4. mysql单列索引和多列索引_mysql索引类型 normal, unique, full text

    问题1:mysql索引类型normal,unique,full text的区别是什么? normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用 ...

  5. mysql聚集索引可以多列吗_MySQL使用单列索引和多列索引

    讨论MySQL选择索引时单列单列索引和多列索引使用,以及多列索引的最左前缀原则. 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一.可以考虑使用索引的主要有两种类型的列:在W ...

  6. mysql数据库最多列_mysql多列索引和最左前缀

    数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度. 索引优化是数据库优化的最重要手段. 如果查询语句使 ...

  7. 正确理解Mysql的列索引和多列索引

    本文转自:http://blog.csdn.net/lovelyhermione/article/details/4580866 Mysql数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大 ...

  8. mysql添加临时索引_mysql 中添加索引的三种方法

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  9. MySQL组合索引(多列索引)使用与优化

    一.多列索引 我们经常听到一些人说"把WHERE条件里的列都加上索引",其实这个建议非常错误.在多个列上建立单独的索引大部分情况下并不能提高MySQL的查询性能.MySQL在5.0 ...

最新文章

  1. Vbox共享文件夹不显示了
  2. poj3481(map的使用)
  3. 【BZOJ-13962865】识别子串字符串识别 后缀自动机/后缀树组 + 线段树
  4. BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)
  5. 邹伟博士出书啦!——《强化学习》从基础概念、核心原理到应用案例(文末赠书)...
  6. vue-axios下载文件流blob,ie下载报传递给系统调用的数据区域太小.ie文件流下载报错;文件下载失败将blob的错误信息转换成json格式
  7. 前端学习(3009):vue+element今日头条管理--登录中的loding
  8. 图形学 射线相交算法_计算机图形学中的阴极射线管(CRT)
  9. PAT 1014 Waiting in Line
  10. SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
  11. tp框架使用心得(六)——分页查询
  12. iphone中扫描wifi热点
  13. 前端学习笔记day14 移动盒子 封装函数
  14. 计算机组成原理 王道考研2021 第一章:计算机组成原理概述 -- 本章小结、常见问题和易混淆知识点
  15. Da黄蜂vep云课堂6.05录屏截屏提取为mp4教程
  16. 彻底禁用UAC,解决“Windows 8/10 Administrator须以管理员身份运行才有权限”的问题
  17. 非接触物体尺寸形态测量(G 题)
  18. js 获取字符串的UTF8编码
  19. WordPress使用SQL语句批量替换失效的蓝奏云下载地址
  20. 牛客网暑期ACM多校训练营(第二场)A .run

热门文章

  1. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节 ①...
  2. 在vmware esx平台创建windows 2003 server群集时无法找到共享磁盘的解决方法
  3. 【php】php编译pcntl以支持多进程
  4. RedHat已更改其开源许可规则
  5. Oracle等待事件Enqueue CI:Cross Instance Call Invocation
  6. PostgreSQL 创建库时如何指定 Collate, Ctype
  7. 如何解决并发的问题(SQL锁的使用)
  8. Can not find the tag library descriptor for http://www.springframework.org/tags/form 解决方法
  9. golang switch case语句 简介
  10. linux shell 杀进程 kill 包含关键字的进程