盘点索引设计规范那些事

运维 数据库运维
5.6版本之前,一个sql只能使用到一个表中的一个索引,5.6以后,虽然有了合并索引的优化方式,但是还是远远没有使用一个联合索引的查询方式好。

[[394893]]

本文转载自微信公众号「UP技术控」,作者conan5566 。转载本文请联系UP技术控公众号。

1、限制每张表上的索引数量,建议单张表索引不超过5个

索引并不是越多越好!索引可以提高效率同样可以降低效率。

索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。

因为mysql优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加mysql优化器生成执行计划的时间,同样会降低查询性能。

2、禁止给表中的每一列都建立单独的索引

5.6版本之前,一个sql只能使用到一个表中的一个索引,5.6以后,虽然有了合并索引的优化方式,但是还是远远没有使用一个联合索引的查询方式好

3、每个Innodb表必须有个主键

Innodb是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。

每个表都可以有多个索引,但是表的存储顺序只能有一种 Innodb是按照主键索引的顺序来组织表的。

不要使用更新频繁的列作为主键,不适用多列主键(相当于联合索引) 不要使用UUID、MD5、HASH、字符串列作为主键(无法保证数据的顺序增长)。

主键建议使用自增ID值。

常见索引列建议

出现在SELECT、UPDATE、DELETE语句的WHERE从句中的列

包含在ORDER BY、GROUP BY、DISTINCT中的字段

并不要将符合1和2中的字段的列都建立一个索引,通常将1、2中的字段建立联合索引效果更好

多表join的关联列

如何选择索引列的顺序

建立索引的目的是:希望通过索引进行数据查找,减少随机IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数);

尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO性能也就越好);

使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)。

避免建立冗余索引和重复索引

因为这样会增加查询优化器生成执行计划的时间。

重复索引示例:primary key(id)、index(id)、unique index(id)

冗余索引示例:index(a,b,c)、index(a,b)、index(a)

优先考虑覆盖索引

对于频繁的查询优先考虑使用覆盖索引。

覆盖索引:就是包含了所有查询字段(where,select,ordery by,group by包含的字段)的索引

覆盖索引的好处:

避免Innodb表进行索引的二次查询

Innodb是以聚集索引的顺序来存储的,对于Innodb来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了IO操作,提升了查询效率。

可以把随机IO变成顺序IO加快查询效率

由于覆盖索引是按键值的顺序存储的,对于IO密集型的范围查找来说,对比随机从磁盘读取每一行的数据IO要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的IO转变成索引查找的顺序IO。

索引SET规范

尽量避免使用外键约束

不建议使用外键约束(foreign key),但一定要在表与表之间的关联键上建立索引;

外键可用于保证数据的参照完整性,但建议在业务端实现;

外键会影响父表和子表的写操作从而降低性能。

 

责任编辑:武晓燕 来源: UP技术控
相关推荐

2011-12-02 10:32:23

Java

2010-04-12 15:53:09

Oracle

2021-04-21 08:09:50

iOSApp设计iPhone

2014-08-29 10:24:05

SQL Server

2009-10-22 12:50:32

校园综合布线系统

2021-01-26 13:31:48

数据库关系型数据库冗余

2010-05-11 18:57:53

MYSQL数据库命名

2023-07-24 16:08:17

测试开发

2012-01-18 14:50:35

Android 4.0设计规范界面

2014-08-07 10:13:43

谷歌Material De设计规范

2011-08-12 14:18:38

SQL Server数设计规范

2014-06-17 12:50:04

2011-07-25 18:40:43

iPad iPad开发 界面

2018-08-04 06:35:41

物联网IOT智能

2010-04-19 12:35:01

Oracle数据库设计

2024-04-09 08:55:54

MySQL产品模型

2018-06-06 14:05:16

移动端设计iOS

2017-12-27 11:59:52

2017-09-04 13:51:29

Android

2009-01-13 10:50:19

数据库设计规范化
点赞
收藏

51CTO技术栈公众号