一、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. Natas11 Writeup(常见编码、异或逆推、修改cookie)

    Natas11: 页面提示cookie被异或加密保护,查看源码,发现了一个预定义参数和三个函数. //预定义参数,猜测将showpassword设置为yes即可得到密码. $defaultdata = ...

  2. Android UI性能测试——使用 Systrace 查找问题

    一 官方文档翻译 官文地址:https://developer.android.com/studio/command-line/systrace systrace命令允许您在系统级别上收集和检查所有运 ...

  3. Frist

    大家好,这是我开通博客的第一天,开通博客呢原因是在于想提升自己.我现在是一名大一的计算机科学与技术的学生,自己本来就对计算机感兴趣,现在想通过博客园这个平台写一些自己感兴趣的文章.现在主要在学java ...

  4. datetime和time

    datetime和time 1.datetime模块 import datetimenow = datetime.datetime.now() #时间对象print(now,type(now))pri ...

  5. 关于手机淘宝3.25bug我的一些思考与建议

    这两天被手淘ios版3.25bug刷屏了,影响还是挺大的,仅3.25日当天截止到下午5点在微博上的话题阅读量,已经突破8000万.给广大网友带来一次吃瓜盛宴.我们先简单回顾下这个bug的故事线: 我查 ...

  6. 最便捷的神经网络可视化工具之一--Flashtorch

    前言 几周前,我在AnitaB.org组织的Hopperx1 London上发表了演讲作为伦敦科技周的一部分. 在演讲结束后,我收到了热烈的反馈,所以我决定写一个稍微长一点的演讲版本来介绍FlashT ...

  7. 【深度学习】Neural networks(神经网络)(一)

    神经网络的图解 感知机,是人工设置权重.让它的输出值符合预期. 而神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数. 如果用图来表示神经网络,最左边的一列称为输入层,最右边的一列称为输 ...

  8. Flutter Weekly Issue 49

    插件/Librarys flutter_date_pickers Allows to use date pickers without dialog. Provides some customizab ...

  9. MFC之登录框的问题处理

    1.在做登录框的时候,把登录框做成模态对话框,并且放在 主界面程序所在窗口打开之前.也就是放在主界面类的InitInstance()里.这样做就会在弹出主界面之前被登录框弹出模态框出来阻塞住. 1.但 ...

  10. Ali_Cloud++:阿里云服务器防火墙相关命令

    systemctl start firewalld ##启动Firewall systemctl stop firewalld ##关闭Firewall systemctl restart firew ...