mysql 组合主键索引_mysql 组合索引带主键ID的问题
场景:
mysql 5.7 某表 t_apply_info 上的2个索引,一个组合索引带了 主键字段 ID,另一个是同字段的单列索引
例如:
KEY idx_1 (apply_serial_no,id)
KEY idx_2 (apply_serial_no)
--此处id为表的主键,自增字段
讨论:
这个组合索引的建立是否无意义,主键ID字段多余并且影响的性能。
理论方面:
mysql innodb中 组合索引为二级索引,由键值,主键,地址(指针),以page的形式存储。
如果是以ID为主键,那么单列索引里面已经存储了键值。
那么使用索引在相关条件下 ,可以优化使用id的 查询 例如
select id from xxx where
等等sql
--如果谓词中出现主键id 条件,那么会使用主键
推论:
带键值的组合索引 增加了索引长度,那么会导致索引占的空间更大,扫描索引耗时更长,在理论情况下,带主键的组合索引效率要低于其单列索引
对比oracle:
如果是在oracle中,索引为普通B+树索引,其中存储的rowid,不包含主键。那么上述讨论的两种索引 适用的范围 是 带ID的组合索引>单列索引。oracle 中需要根据具体情况讨论
实验:
在表数据量为5千万的量级中
--分别测试 单列索引和组合索引的查询性能
查询sql 为
select count(*) from t_apply_info where apply_serial_no >=xxxx
可以 发现使用的是单列索引(mysql选择最优索引),查询时间为12s
--扫描 数据量为4千万行
删除单列索引,此时查询只能走 组合索引
然后再次查询:select count(*) from t_apply_info where apply_serial_no >=xxxx
观察执行计划发行,出了使用的索引有区别外,执行计划无太大差别
查询时间为:
12.3s
--见此处多了一个ID的索引长度对范围扫描性能有些影响,但是不是很大,基本上可以忽略(大概2-3%)
结论:
在mysql 环境中,对于带主键的组合索引 无意义,因为二级索引的构成已经包含了主键值,索引mysql 会自动选择更优的单列索引。
在5千万行数据量下的唯一键值查询 两个索引的性能无差别,但是涉及到范围查询,扫描的数据量越大,性能差异越明显(组合索引所占空间大,扫描需要更多的性能)
所以 组合索引带主键ID ,在mysql中是多余的行为,并不能起到优化效果,反而在某些时候会产生负面影响(在5千万数据量时,降低索引性能越3%)。
mysql 组合主键索引_mysql 组合索引带主键ID的问题相关推荐
- mysql navicat 组合索引_mysql组合索引与字段顺序
很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引! 一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子: 假设 ...
- mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...
- mysql repair 索引_mysql 创建索引、重建索引、查询索引、删除索引 转自:http://www.phpernote.com/mysql/942.html...
本篇文章主要是对MySQL索引操作方法做了一下总结,包括创建索引.重建索引.查询索引.删除索引的操作.以下所列示例中中 `table_name` 表示数据表名,`index_name` 表示索引名,c ...
- mysql单列索引和多列索引_mysql 单列索引与多列索引
以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...
- mysql最常用的索引_mysql常用索引
1.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引的作用相当 ...
- mysql 动态索引_MySQL的索引
在日常工作中,我们经常会用到mysql的索引.使用索引的目的基本上就是为了在大量的数据中快速找出某个列中一个特定值的行,简单说就是提高查询效率. 使用索引的优点: 可以快速检索,减少I/O次数,加快检 ...
- mysql高效索引覆盖索引_MySQL高效索引:覆盖索引
原标题:MySQL高效索引:覆盖索引 作者:踏雪无痕 cnblogs.com/chenpingzhao/p/4776981.html 概念 如果索引包含所有满足查询需要的数据,则该索引称为覆盖索引(C ...
- mysql的联合索引_mysql联合索引详解
联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...
- mysql按升序创建索引_Mysql创建索引
摘自:http://blog.chinaunix.net/uid-25063573-id-3032578.html 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技 ...
最新文章
- 如何在Visual Studio Code中编译C ++代码
- 2、求100以内的素数之和。(20分)
- 已解决:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshaketimeout
- java super实例_java Super 用法详解及实例代码
- 成功解决 编程语言代码结果中输出-9223372036854775808的数据
- Ubuntu1404 开启定时任务 crontab
- spring cloud入门_SpringBoot 入门系列0SpringBoot与SpringCloud技术选型
- 服务器设备日常维护与管理论文,浅谈设备管理与维护论文
- IP,VIP,SCAN IP之间的关系是怎么样的呢?
- 招博士生 | 澳门科技大学人工智能课题组
- html和css页面自动缩小和放大,如何使用CSS和Javascript来缩小HTML?
- php页面传递参数值几种方法总结
- HDOJ 1003:求一串数字中和最大的连续子串
- PHP 微信小程序 WebSocket MySQL Redis实现聊天功能
- 推荐几款好的小程序UI库组件
- 小写字母转换大写字母代码
- Centos 8 安装 Openbravo 之安装 postgresql
- 腾讯云GPU服务器深度学习环境搭建
- 工程师思维是什么?芯片工程师要有哪些思维习惯?
- 坚持并活下去!cxuan 在 CSDN 的 2020 年终总结。