MySQL索引和查询优化

一,MySQL索引类型
1,主键索引PRIMARY KEY
特殊的唯一索引,不允许null,一张表只能有一个主键。
2,唯一索引
唯一索引列的必须唯一,但是允许空值,如果是组合索引,则列值的组合必须唯一。
3,普通索引
最基本的索引没有任何限制。
4,组合索引
一个索引包含很多的列。
5,全文索引
就是全文检索,myisam存储引擎支持。
二,索引的结构及原理
普遍使用b+tree做索引,但是实际上又根据聚簇索引和非聚簇索引而不同,myisam存储引擎是非聚簇索引,innodb是聚簇索引。
1,b+tree的介绍
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019070615311738.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpb
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来连接条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值