mysql怎么查询原理 mysql的查询方式( 二 )


MySQL索引机制(详细+原理+解析)MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度 。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index) 。
集一个索引包含多个列(最左前缀匹配原则)
索引列的值必须唯一,但允许有空值
全文索引为FUllText , 在定义索引的列上支持值的全文查找 , 允许在这些索引列中插入重复值和空值 , 全文索引可以在CHAR,VARCHAR,TEXT类型列上创建
设定主键后数据会自动建立索引,InnoDB为聚簇索引
即一个索引只包含单个列,一个表可以有多个单列索引
覆盖索引是指一个查询语句的执行只用从所有就能够得到,不必从数据表中读取,覆盖索引不是索引树,是一个结果,当一条查询语句符合覆盖索引条件时候,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后的回表操作 , 减少了I/O效率
查看索引
列名解析:
删除索引
查看:
删除前:
删除后:
普通的索引 , 没有什么介绍
查看:(注意和前缀索引Sub_part的区别)
当索引的列是unique的时候,会生成唯一索引,唯一索引关于null有下列两种情况
SQLSERVER 下的唯一索引的列,允许null值,但最多允许有一个空值
MYSQL下的唯一索引的列,允许null值,并且允许多个空值
查看:
会建立两个索引,一个非聚簇索引 , 一个是唯一索引
结果:
可以插入两个空值(明人不说暗话,我喜欢MySQL)
一方面,它不会索引所有字段所有字符,会减小索引树的大小.
另外一方面,索引只是为了区别出值,对于某些列,可能前几位区别很大,我们就可以使用前缀索引 。
一般情况下某个前缀的选择性也是足够高的,足以满足查询性能 。对于BLOB,TEXT , 或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度 。
查看:
查看:
复合索引的最左前缀匹配原则 :
对于复合索引,查询在一定条件才会使用该索引
减少开销 。建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引 。每多一个索引 , 都会增加写操作的开销和磁盘空间的开销 。对于大量数据的表,使用联合索引会大大的减少开销!
覆盖索引 。对联合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2 。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作 。减少io操作,特别的随机io其实是dba主要的优化策略 。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一 。
效率高 。索引列越多,通过索引筛选出的数据越少 。有1000W条数据的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W10%=100w条数据 , 然后再回表从100w条数据中找到符合col2=2 and col3= 3的数据,然后再排序,再分页;如果是联合索引,通过索引筛选出1000w10% 10% *10%=1w 。
在模糊搜索中很有效 , 搜索全文中的某一个字段,可以参考这篇博文
:
我们先进行下面一个实验看看InnoDB下的主键索引的一个现象 。
查看:
我们插入进去的时候,数据的id都是乱序的,为什么这里最后select查询出来的结果都是进行了排序?

推荐阅读