一、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 主键和默认 设为索引的规则的更多相关文章

  1. mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引

    原文链接 我的归纳: (1)InnoDB的主键采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是索引值和数据本身(注意和MyISAM的不同). (2)InnoDB的二级索引不使用 ...

  2. MySQL主键和索引的联系及区别

    转载自:http://www.nowamagic.net/librarys/veda/detail/1954 关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识 ...

  3. MySQL主键与索引的区别和联系

    MySQL主键与索引的区别和联系   关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(Inn ...

  4. Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别

    原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不 ...

  5. MYSQL主键自动增加的配置及auto_increment注意事项

    文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二:   点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...

  6. MySQL主键设计

    [TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主 ...

  7. mysql主键问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_22314145/article/details/80824660 MySQL主键 一. MyS ...

  8. MySQL主键设计盘点

    目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 @ 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的 ...

  9. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

随机推荐

  1. HTML每日学习笔记(3)

    7.17.2019 XHTML 1.XHTML与HTML的区别: XHTML 元素必须被正确地嵌套. XHTML 元素必须被关闭. 标签名必须用小写字母. XHTML 文档必须拥有根元素.(所有的 X ...

  2. Mysql 查询天、周,月,季度、年的数据

    Mysql 查询天.周,月,季度.年的数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 ...

  3. 聊聊OkHttp实现WebSocket细节,包括鉴权和长连接保活及其原理!

    一.序 OkHttp 应该算是 Android 中使用最广泛的网络库了,我们通常会利用它来实现 HTTP 请求,但是实际上它还可以支持 WebSocket,并且使用起来还非常的便捷. 那本文就来聊聊, ...

  4. Webpack中SplitChunksPlugin 配置参数详解

    代码分割本身和 webpack 没有什么关系,但是由于使用 webpack 可以非常轻松地实现代码分割,所以提到代码分割首先就会想到使用 webopack 实现. 在 webpack 中是使用 Spl ...

  5. Thinkphp绕过宝塔getshell

    可以看到直接被拦了,经测试这里是敏感函数字符拦截,大部分有用的敏感函数都被拦了,这里面被拦的是phpinfo() Emmmm,怎么办呢..... 直接执行代码不行,那么就写入代码吧,用file_put ...

  6. 微信小程序开发-小程序之间的跳转

    前几天开发微信小程序,其中有个需要联动宣传的业务,就是正在开发的小程序跳转到别的小程序去, 然后去看了下大家的做法与看法,总结下这小程序跳转之间应该注意到的几个问题 首先是跳转的方法, https:/ ...

  7. VS code调试代码快速上手必备知识

    一.通过简单的配置运行一个JavaScript程序 1.打开(创建)一个新的工作空间(文件夹),并创建一个js文件: var name='world'; var s='Hello,${name}!'; ...

  8. Smallest Range II

    2020-01-21 21:43:52 问题描述: 问题求解: 这个题目还是有点难度的,感觉很巧妙也很难想到. 整体的思路如下: 1. 首先原问题等价于 +0 / + 2*K 2. 那么res = M ...

  9. leetcode 签到 836. 矩形重叠

    836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...

  10. Flutter 强大的MediaQuery控件

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 MediaQuery 通常情况下,不会直接将MediaQu ...