一、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. python高阶函数&异常处理

    高阶函数 1.什么是高阶函数 在Python中,变量可以指向函数 函数名也是变量 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. ma ...

  2. weblogic-CVE-2020-2551-IIOP反序列化学习记录

    CORBA: 具体的对CORBA的介绍安全客这篇文章https://www.anquanke.com/post/id/199227说的很详细,但是完全记住是不可能的,我觉得读完它要弄清以下几个点: 1 ...

  3. 在ASP.NET MVC中如何预防Cookie的窃取攻击(转载)

    Cookie Cookie is a small piece of data sent by a web server to a web browser. The browser stores thi ...

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

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

  5. MySQL对JSON类型UTF-8编码导致中文乱码探讨

    前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...

  6. Dropout的前世与今生

    Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术已经引起了研究者们的广泛兴趣,并且被广泛地应用于神经网络正则化.模型压缩等任务.虽然 Dropout 最初是为密集的神经网络层量身定制 ...

  7. VBScript - 动态 Array 实现方法大全!

    记录一些方法,关于 VBScript 中,动态 Array 的实现 ,也适用于 VBA, 很久以前,写 VBA 的时候,就觉得使用 Array 很不方便,因为大小固定, 当时想的是,要是 Array ...

  8. nodejs使用express中静态资源托管(express.static())时遇到的bug

    如下:将test.html的页面挂载在服务器上, const express= require('express') const fs= require('fs') let app = express ...

  9. 纯css实现图片或者页面变灰色

    前言 今天是个沉痛的日子,全国哀悼英雄,各大平台平日鲜丽的界面置纷纷换成了灰色,以表对逝者的安息与尊敬!!对付疫病,我没多大的本事,只能记录一点点知识来提升自己擅长的技术,待到将来能为国家尽一份绵薄之 ...

  10. Java工程师常用Linux命令

    本文所列的Linux常用命令包含:文件相关(目录操作,内容查看,查找与比较,压缩与解压),进程管理,网络操作,系统管理,性能监测与优化,Java常用工具多个方面概述. 文件目录基本操作 ls 命令用来 ...