mysql怎么建组合索引_mysql索引及建立组合索引原则
两个重要概念
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索引及建立组合索引原则相关推荐
- mysql+index组合索引_MySQL 优化之 index merge(索引合并)
标签: MySQL5.0之前,一条语句中一个表只能使用一个索引,无法同时使用多个索引.但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引.理解了 index mer ...
- mysql 建索引_mysql数据库正确建立索引及使用
普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...
- mysql建表语句主键索引_MySQL添加主键、索引
查看索引 SHOW INDEX FROM 数据库表名 比如:SHOW INDEX FROM order_info; 添加索引 alter table 数据库add index 索引名称(数据库字段名 ...
- mysql 连接查询索引_Mysql (四)连接查询和索引
一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...
- mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例
上篇文章最后提了个问题 假设某个表有一个**复合索引(c1,c2,c3,c4)**,问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些 1. where c1=x and c2=x and ...
- mysql左模糊 走索引_mysql的模糊查找是否走索引问题
2019独角兽企业重金招聘Python工程师标准>>> 在数据库中索引对于查找是非常有用的,楼主做了两个实验,插入数据的时候非常慢,楼主是这样实验的: 一:数据库列的索引 ①:首先执 ...
- mysql按升序创建索引_Mysql中的降序索引底层实现
什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...
- mysql 如何添加索引_MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】...
MySQL如何创建一个好索引?创建索引的5条建议 过滤效率高的放前面 对于一个多列索引,它的存储顺序是先按第一列进行比较,然后是第二列,第三列...这样.查询时,如果第一列能够排除的越多,那么后面列需 ...
- rds mysql 表被删了_MySQL · 捉虫动态 · 删除索引导致表无法打开
问题背景 最近线上遇到一个问题,用户重启实例后发现有张表打不开了,经调研后发现是用户之前的霸蛮操作导致的,下面给出复现步骤: create table t1 (id int not null prim ...
- mysql主键和唯一索引_mysql 主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...
最新文章
- ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
- 利用nginx-status监控nginx服务器状态
- Matlab中下标、斜体及希腊字母的使用方法
- 树的同构模板题(法1.最小表示法+法2.树哈希)
- python爬取视频自动播放_如何在IPython笔记本上自动播放声音?
- axios 的简单使用
- iOS 九宫格手势密码
- php的核心类 控制,phpMVC框架的核心启动类定义
- 我的世界服务器怎么显示玩家和怪,我的世界怎样用指令来让怪物不攻击玩家 | 手游网游页游攻略大全...
- 008/160 CrackMe Andrénalin #1
- 桌面创建快捷方式 不显示图标
- 中国身份证号码验证,支持15,18位
- 服务器遇到DDOS攻击怎么办?
- 翟菜花:《完美世界》手游大火,大文娱的卡路里能释放多少热量?
- 小程序登录问题--登录函数getUserInfo()写在app.js中,首次加载无法获取后台处理过的用户的信息,刷新一次后就可以获取的解决
- 7.微信小程序(布局适配与物理逻辑像素)
- 干货!山东省软件著作权登记申请好处及软著的保护期解答
- OKPay遭到DDoS攻击,本周进一步威胁网络攻击
- Diebold-Mariano检验
- zookeeper Unable to read additional data from server sessionid 0x0
热门文章
- 传智播客35期JavaEE工程师从基础到实战视频
- 苹果笔记本没有计算机管理员,苹果电脑忘记管理员密码怎么办
- 03.MAC地址_IP地址_子网掩码
- linux添加用户,用户组,安装samba.添加共享目录
- 爬虫学习-Web-Harvest
- 要点提炼|《数字中国建设整体布局规划》,看这一篇就够了!
- Catia VBA二次开发:宏的录制,精简,改编,回放
- 掌财社寒山:白马股和黑马股有什么区别?
- 虹科教您 | 从零开始认识频谱分析仪
- ld: symbol(s) not found for architecture i386 只在iPad模拟器上报错,其它模拟器上正常显示