两个重要概念

1.对于mysql来说,一条sql中,一个表无论其蕴含的索引有多少,但是有且只用一条。

2.对于多列索引来说(a,b,c)其相当于3个索引(a),(a,b),(a,b,c)3个索引,又由于mysql的索引优化器,其where条件后的语句是可以乱序的,比如(b,c,a)也是可以用到索引。如果条件中a,c出现的多,为了更好的利用索引故最好将其修改为(a.c,b)。

ICP概念

看了一篇大神的博客,上面说了通用索引匹配原则,这里也顺便说下。

1.Index range 先确认索引的起止范围。

2.Index Filter 索引过滤。

3.Table Filter 表过滤。

传说中mysql5.6后提出的icp就是多了第二步,以前Index filter是放在数据上操作的,现在5.6后多了第二步,因此效率提高了很多。

原则:

1、需要加索引的字段,要在where条件中

2、数据量少的字段不需要加索引

3、如果where条件中是OR关系,加索引不起作用

4、符合最左原则

举例:

联合索引(a、b、c) 使用a或者a或者a、b或a、b、c这3种可以进行查找,不支持b、c进行查找

什么时候创建组合索引?

当我们的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 `left_test` (

`id` int(11) NOT NULL,

`a` int(11) DEFAULT NULL,

`b` int(11) DEFAULT NULL,

`c` int(11) DEFAULT NULL,

`d` int(11) DEFAULT NULL,

`e` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `m_index` (`a`,`b`,`c`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

且插入了100万条数据。

sql的分析

select * from left_table where id=1。

select * from left_table where id>1 and id<3

使用了聚集索引,id为主键,那么这个表里面id则是聚集索引列,这条sql默认使用了聚集索引来搜索。

select * from left_table where a=1

select * from left_table where a=1 and b=1

select * from left_table where a=1 and b=1 and c=1

使用联合索引(a,b,c)。其中这些条件可以可以乱序,因为mysql的sql优化器会优化这些代码

select * from left_table where a<1

select * from left_table where a<1 and b<1

select * from left_table where a<1 and b<1 and c<1

对于现在mysql5.7中,只有小于等于和小于才会触发索引。而大于则是无法触发索引,且小于可以乱序(mysql优化器优化了),但是按照最左匹配原则。比如条件(b),(c),(b,c)组合就不行。

mysql怎么建组合索引_mysql索引及建立组合索引原则相关推荐

  1. mysql+index组合索引_MySQL 优化之 index merge(索引合并)

    标签: MySQL5.0之前,一条语句中一个表只能使用一个索引,无法同时使用多个索引.但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引.理解了 index mer ...

  2. mysql 建索引_mysql数据库正确建立索引及使用

    普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...

  3. mysql建表语句主键索引_MySQL添加主键、索引

    查看索引 SHOW INDEX FROM  数据库表名 比如:SHOW INDEX FROM order_info; 添加索引 alter table 数据库add index 索引名称(数据库字段名 ...

  4. mysql 连接查询索引_Mysql (四)连接查询和索引

    一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...

  5. mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例

    上篇文章最后提了个问题 假设某个表有一个**复合索引(c1,c2,c3,c4)**,问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些 1. where c1=x and c2=x and ...

  6. mysql左模糊 走索引_mysql的模糊查找是否走索引问题

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库中索引对于查找是非常有用的,楼主做了两个实验,插入数据的时候非常慢,楼主是这样实验的: 一:数据库列的索引 ①:首先执 ...

  7. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  8. mysql 如何添加索引_MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】...

    MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...

  9. rds mysql 表被删了_MySQL · 捉虫动态 · 删除索引导致表无法打开

    问题背景 最近线上遇到一个问题,用户重启实例后发现有张表打不开了,经调研后发现是用户之前的霸蛮操作导致的,下面给出复现步骤: create table t1 (id int not null prim ...

  10. mysql主键和唯一索引_mysql 主键和唯一索引的区别

    主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...

最新文章

  1. ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
  2. 利用nginx-status监控nginx服务器状态
  3. Matlab中下标、斜体及希腊字母的使用方法
  4. 树的同构模板题(法1.最小表示法+法2.树哈希)
  5. python爬取视频自动播放_如何在IPython笔记本上自动播放声音?
  6. axios 的简单使用
  7. iOS 九宫格手势密码
  8. php的核心类 控制,phpMVC框架的核心启动类定义
  9. 我的世界服务器怎么显示玩家和怪,我的世界怎样用指令来让怪物不攻击玩家 | 手游网游页游攻略大全...
  10. 008/160 CrackMe Andrénalin #1
  11. 桌面创建快捷方式 不显示图标
  12. 中国身份证号码验证,支持15,18位
  13. 服务器遇到DDOS攻击怎么办?
  14. 翟菜花:《完美世界》手游大火,大文娱的卡路里能释放多少热量?
  15. 小程序登录问题--登录函数getUserInfo()写在app.js中,首次加载无法获取后台处理过的用户的信息,刷新一次后就可以获取的解决
  16. 7.微信小程序(布局适配与物理逻辑像素)
  17. 干货!山东省软件著作权登记申请好处及软著的保护期解答
  18. OKPay遭到DDoS攻击,本周进一步威胁网络攻击
  19. Diebold-Mariano检验
  20. zookeeper Unable to read additional data from server sessionid 0x0

热门文章

  1. 传智播客35期JavaEE工程师从基础到实战视频
  2. 苹果笔记本没有计算机管理员,苹果电脑忘记管理员密码怎么办
  3. 03.MAC地址_IP地址_子网掩码
  4. linux添加用户,用户组,安装samba.添加共享目录
  5. 爬虫学习-Web-Harvest
  6. 要点提炼|《数字中国建设整体布局规划》,看这一篇就够了!
  7. Catia VBA二次开发:宏的录制,精简,改编,回放
  8. 掌财社寒山:白马股和黑马股有什么区别?
  9. 虹科教您 | 从零开始认识频谱分析仪
  10. ld: symbol(s) not found for architecture i386 只在iPad模拟器上报错,其它模拟器上正常显示