一,MySQL索引类型
1,主键索引PRIMARY KEY
特殊的唯一索引,不允许null,一张表只能有一个主键。
2,唯一索引
唯一索引列的必须唯一,但是允许空值,如果是组合索引,则列值的组合必须唯一。
3,普通索引
最基本的索引没有任何限制。
4,组合索引
一个索引包含很多的列。
5,全文索引
就是全文检索,myisam存储引擎支持。
二,索引的结构及原理
普遍使用b+tree做索引,但是实际上又根据聚簇索引和非聚簇索引而不同,myisam存储引擎是非聚簇索引,innodb是聚簇索引。
1,b+tree的介绍
b+tree所有关键数据存在叶子节点,非叶子节点不存储真正的数据。
为所有节点增加一个链指针
为什么用b+tree做索引?
因为MySQL是基于磁盘的,索引查找涉及到磁盘消耗,所以索引的设计结构要尽量减少磁盘IO的次数,什么要使用B/B+树,跟磁盘的存储原理有关。
局部性原理与磁盘预读
为了提升效率,要尽量减少磁盘IO的次数。实际过程中,磁盘并不是每次严格按需读取,而是每次都会预读。磁盘读取完需要的数据后,会按顺序再多读一部分数据到内存中,这样做的理论依据是计算机科学中注明的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用,程序运行期间所需要的数据通常比较集中 。
(1)由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),
因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。
(2)MySQL(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16K(这个值可以修改)。linux 默认页大小为4K。
三,建立索引的几大原则
1,最左前缀匹配原则
对子组合索引,总是从索引的最左字段开始,中间不能跳过,比如组合索引列(name,age,sex),使用索引(name,age),(name,age,sex),中间不能跳过。
2,尽量选择区分度高的列做索引。
3,=和in可以乱序。
4,索引列不能参与计算,保持列‘干净’。
5,尽量不要扩展索引,不要新建索引。
四,常见的查询优化
1,MySQL语句中的数据类型要与索引存储数据类型要一致。
例如:数据库中索引字段 a 类型是 varchar(10),
sql语句中select * from table where a=1; 此时此语句就没有用到索引。
2,避免select * 减少多余的查询。
3,like的参数以通配符开头。
4,where条件不符合最左查询。
5,使用!=和<>.
6,索引列参加计算。
7,使用or来连接条件
MySQL索引和查询优化
最新推荐文章于 2023-05-10 17:51:19 发布