mysql的索引和优化

Mysql的索引和优化

docker 安装 mysql5.7 :

https://www.dahuangzi.work/#/essaydetail/MjI=

索引:

索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。

为什么用索引:

如果你的字典没有目录,你给我查一个字,我看看。

一、索引分类:

mysql 的索引分为 单例索引(主键索引、唯一索引、普通索引)和 组合索引。

  • 单例索引:一个索引只包含一个列,一个表可以有多个单例索引。
  • 组合索引:一个组合索引包含两个或两个以上的列。

1、主键索引:

primary key:在创建表选择主键的时候,默认生成主键索引,是一种特殊的唯一索引(不允许有空值)。

2、 唯一索引:

Unique:设置唯一索引的字段不能有重复的数据。

3、普通索引:

Normal:

  • 用来加速数据访问速度而建立的索引。
  • 多建立在经常出现在查询条件的字段和经常用于排序的字段。
  • 被索引的数据列允许包含重复的值

4、组合索引:

一个索引列中包含一个以上的字段

二、索引方法(索引的两大类型Hash与Btree):

—说索引就必须说的 (存储引擎)

*不同的引擎对于索引有不同的支持:

Innodb和MyISAM默认的索引是Btree索引;
Mermory默认的索引是Hash索引。

*MYISAM引擎:非聚集索引

因为索引文件myi和数据文件myd是分开的,myi里面存储的是myd文件的指针,而且主键索引和非主键索引没有层次关系,因为存储的都是指向myd文件的指针

*Innodb引擎:聚集索引

只有一个idb文件,在主键索引和非主键索引有层次的关系,因为主键索引存储的是真是的信息,而非主键索引存储的是主键的信息

我们在mysql中常用两种索引算法BTree和Hash,两种算法检索方式不一样,对查询的作用也不一样。

1、Btree

BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量。

Btree索引中的最左匹配原则

Btree是按照从左到右的顺序来建立搜索树的。比如索引是(name,age,sex),会先检查name字段,如果name字段相同再去检查后两个字段。

所以当传进来的是后两个字段的数据(age,sex),因为建立搜索树的时候是按照第一个字段建立的,所以必须根据name字段才能知道下一个字段去哪里查询。

传进来的是(name,sex)时,首先会根据name指定搜索方向,但是第二个字段缺失,所以将name字段正确的都找到后,然后才会去匹配sex的数据。
select * from user where sex=0 ; false
select * from user where sex=0 and name=’’; true

2、Hash

所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,只能用于对等比较,例如=,<=>(相当于=)操作符

三、建立索引的规则:

1、利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。

2、不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。

3、尽量扩展索引而不要新建索引

4、最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

5、不同值较少的列不必要建立索引(性别)。

mysql不推荐用UUID做主键

  • UUID字段很长,而且不是int类型的,存储的数据量就会大大减少,索引效率不高。
  • UUID因为不是自增的,在插入索引的时候,会对原有的叶片就行维护并分裂的成本特别高。

注意:

一个表不要创建过多的索引,索引是方便了查询,同样它也是有维护的代价,和占用的空间。 添加和删除都有维护索引的消耗。

个人博客: https://www.dahuangzi.work/ "

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值