mysql 主键和默认 设为索引的规则
一、mysql 表中如果是单主键的话,那这个主键也会被 系统默认建为 索引
二、mysql 表中如果是复合主键的话,那系统会遵循左对齐原则,即如复合主键 a 和 b字段和c字段..., 默认建的主键索引是abc即主键全有,把所有主键全部建立在一个单独的主键索引中。那只有条件中有a的话这个索引才会命中,条件中如果不带a,只带b或其他的都不会命中索引,即主键索引都不起作用。由于a字段是在b字段前,索引遵循左对齐规则,只会把a默认作为比较对象,条件中只有带a才会命中,查询中如 where a=? 或 where a=? and b=? 这2种 查询条件中只要有a就会用到主键索引,即a、ab、abc、a... 只要有a就会用到索引,而 b、bc、bd、bcd、cd、... 条件中只要没有a的都没有用到索引,查询的话就会很慢,索引要么在条件中把a带上,要么把条件中的b或者c等 也单独 建个索引。
三、如果建立一个单独的索引,但索引中包含多个字段,那默认索引也是第一个字段有效,规则同二种所述。如:
CREATE INDEX idx_1 ON player_con_record
(
a
b
c
);
上边建的单独的索引包含 a、b、c 三个字段,但其实查询时条件中只有拥有a的情况下才会索引命中,即只有a才会起效果,如果条件中没有 a 只有 b和c,则上边索引 “idx_1 ”不起作用的,即规则同上边二,只有ab、ac、abc三者上班的 idx_1 才会命中起效果。至于 上边 idx_1 的b 和c 是不是冗余的,估计应该不是的,比如上边这种情况abc三个为单独索引,那我条件中有a=? and b=? and c=? 条件中由于包含a 所以 idx_1 索引 被命中,那可以用idx_1来查询,假如idx_1只有a,而条件中仍然是 a=? and b=? and c=?,那条件中包含a索引idx_1索引也是能命中,那2者区别是什么,不可能说2个idx_1的作用都一样,一样的话岂不是第一种情况中的b和c 是冗余的么,其实是不一样的,因为条件中是abc都有,那而且是在同一个索引中,也就是目录有abc三者的关联,那我条件中又有abc三个条件,那我查询起来的速度肯定比索引只有a的快,因为单独索引a中相当于只有a目录,查数据时只能迅速定位到a,不能继续定位到b和c,所以2中索引建立还是不一样的,即b和c不是冗余的。 那如果我a、b、c 要是单独建立呢,即建3个索引,那效果就是条件中只要有a、b、c中的任何一个就会有索引命中,如果条件中abc三个都有,那三个索引都会同时命中,效果就同 单独索引中建abc一样。那分开建abc三个索引和在单独一个索引中建abc有啥区别和联系呢,联系是如果查询条件中abc都有,而2中建立索引作用效果是一样的,如果查询条件中只有abc中的一部分,那单独索引的那个必须要在条件中有a才能索引命中,而单独建3索引的话肯定就会有索引浪费(建立索引即维护目录需要消耗的),比如条件只有a和b,那c就肯定浪费,所以2中方式各有千秋。
四、对上边总结,假如主键有abc三个为联合主键,那默认会有主键索引 idx{a,b,c},假如条件中有a=? and b=? and c=? 那可以直接用主键索引,如果条件只有a=?and b=? 也会直接用这个主键索引,因为都包含a。假如没有主键,而且已知条件为 a=? and b=? and c=? 那我建立了一个单独索引 idx{a,b,c} 肯定要比 单独索引{a} 查询的快,因为前者建立的索引目录中同时包含abc三者关系目录,而后者索引目录仅有a一个关系目录。创建索引都是有消耗的,索引能少用索引,能合并索引最好。
注:从上边左对齐规整来看,我们以后建表时肯定是 把在条件中经常用的那个 放在最前边,以至于涉及 联合主键时 遵循的左对齐原则能 把这个经常用的字段默认 建立索引。
注:怎么查看索引是否命中可以通过EXPLAIN 关键字,eq:
EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_roleid=1 AND n_fun_type=1 AND n_aid=1;
EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_fun_type=1 AND n_aid=1;
EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_fun_type=1;
EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_aid=1;
EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_sub_type=1;
EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_sub_type=1 AND n_fun_type=1;
mysql 主键和默认 设为索引的规则的更多相关文章
- mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引
原文链接 我的归纳: (1)InnoDB的主键采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是索引值和数据本身(注意和MyISAM的不同). (2)InnoDB的二级索引不使用 ...
- MySQL主键和索引的联系及区别
转载自:http://www.nowamagic.net/librarys/veda/detail/1954 关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识 ...
- MySQL主键与索引的区别和联系
MySQL主键与索引的区别和联系 关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(Inn ...
- Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别
原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不 ...
- MYSQL主键自动增加的配置及auto_increment注意事项
文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二: 点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...
- MySQL主键设计
[TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主 ...
- mysql主键问题
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_22314145/article/details/80824660 MySQL主键 一. MyS ...
- MySQL主键设计盘点
目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 @ 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的 ...
- mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'
mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...
随机推荐
- Natas23 Writeup(php弱类型)
Natas23: 一个登录页面,查看源码,发现关键代码: if(array_key_exists("passwd",$_REQUEST)){ if(strstr($_REQUEST ...
- ASP.NET Core去掉HTTPS配置和SSL证书
如果你的项目一不小心配置了https 右击项目=>属性=>调试=>启用SSL=>选择去掉 测试
- 实例演示:如何简化生产中的Pod安全策略?
Pod安全策略对于强化K8S集群安全至关重要.本文将延续之前的文章继续深入介绍Pod安全策略. 首先,简单介绍了如何将Pod与Pod安全策略相关联,并使用RBAC来展示具体步骤.然后介绍如何在Ranc ...
- effective-java学习笔记---使用枚举类型替代整型常量34
1.要将数据与枚举常量相关联,请声明实例属性并编写一个构造方法,构造方法带有数据并将数据保存在属性中. // Enum type with data and behavior public enum ...
- HDU-6376 度度熊剪纸条
链接 http://acm.hdu.edu.cn/showproblem.php?pid=6376 分析 这道题好像不是很难,因为是要拼出前缀1,所以确定剪下每一段1需要的刀数,然后因为有次数限制,所 ...
- Transformers 简介(下)
作者|huggingface 编译|VK 来源|Github Transformers是TensorFlow 2.0和PyTorch的最新自然语言处理库 Transformers(以前称为pytorc ...
- [Jenkins01] Jenkins的安装和部署(jenkins教程)
一.jenkins的下载.安装以及环境的搭建部署. 1.什么是jenkins以及它的作用: Jenkins 是一个可扩展的持续集成(CI)平台.它只是一个平台,真正运作的都是插件. Jenkins的主 ...
- js数据类型及方法
数据类型及方法 数据类型 number 不区分整数和浮点数 string 字符串 boolean true / false 布尔 object null 数组 function 函数 undefine ...
- JS烟花案例优化版
不明白为什么是烟花优化版本的先参考作者的烟花基础版本 烟花优化版本主要实在优化爆炸的范围和运动上做了优化,爆炸范围我们采用已圆的爆炸方式,以鼠标点击的位置为圆形爆炸的烟花效果 <!DOCTYPE ...
- 排查tomcat服务器CPU使用率过高
tomcat要运行依赖于JDK,tomcat服务器的CPU使用率过高,大多都是因为部署的web程序的问题. 一.现象描述 在一次线上环境,前台访问页面的速度越来越慢,从浏览器F12中看到发出的请求都是 ...