数据库索引规范

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

    索引并非越多越好!索引可以提高效率也可以较低效率。

   索引可以提高查询效率,但是降低了修改和插入的效率。

   mysql在优化查询时,会根据统计信息对每一个可以用的索引进行评估生成一个执行计划。若每一个索引都可以用于查询,那么增加mysql生成执行计划的时间,同样降低sql查询性能。

2.禁止在表中每一列都建立索引。

3.innodb是一个索引组织表。所谓的索引组织表也就是说数据存储的顺序和对应索引的顺序是相同。mysql 的innodb引擎根据主键来组织表。所以每一个innodb表都必须有一个主键。而我们没有在表中设置主键,那么优先使用第一个非空列做主键。要是没有非空列,那么会自动生成一个占6个字节的主键,但是这个主键的性能不好。

不适用更新频繁的列作为主键,不使用多列主键:

  innodb是一个索引组表。主键频繁更新,那么也就意味着数据存储的逻辑顺序会平凡的变动。这样会带来大量的IO操作,CPU站用。这样降低数据库的性能。

不适用UUID,MD5,HASH,字符串作为主键,因为无法保证数据的顺序增长。我们无法保证后面插入的UUID值小于前面的值。若后面插入的UUID值小于前面的值,因为mysql是索引组表,大于这个值的所有数据都需要向后移动,IO操作,CPU暂用。所以建议使用有顺序,不重复的主键。自增id是个不错的选择。

工作经验:

1.在哪些列上建立索引:通常在select,update,delete的where语句的列中建立索引。(注意在where语句后面的列建立联合主键的性能会更好)。

包含在order by, group by ,distinct中的字段。

多表join的关联列上建立索引。

2.如何选择索引列的顺序

   在联合索引中是从左到右顺序来使用的。索引列的顺序决定了是否使用索引以及索引是否高效。

  我们之所以增加索引是为了查询是使用索引查找减少磁盘的随机io,索引能过滤很多数据,那么我们就不需要从磁盘读取大量的数据。

   (1)我们需要把区分度最高的列放在联合索引最左侧。区分度:列中数据不重复的量与列的行数比值来确定区分度。从这点来看区分度最大就是主键。

    (2)尽量把字段长度小的列放在联合索引的最左侧。字段长度小一页中存储量越大IO性能也就最好。

     (3)使用最频繁的列放到联合索引的左侧。

   (4)避免建立冗余索引和重复索引。

index(a,b,c) index(a,b) index(a)冗余索引。联合索引从左到有使用,所以a类索引是冗余索引。

  (5)对于频繁的查询有限考虑覆盖索引。

    覆盖索引:就是包含了所有需要查询字段的索引。where,select,groupby,order等的列。

   innodb是根据具体索引的顺序来存储的。那么块级索引在叶子节点中以行的主键形式保存。利用二级索引查询数据在查找到相应的主键之后还需要二次查询进而拿到数据。而在覆盖索引中二级索引的键值可以获取所有的数据这样就避免了对主键的 二次查询,减少IO炒作。

 可以把随机IO变为顺序IO,加快查询效率。

  (6)尽量避免使用外键。

     表与表之间的关联键上建立索引。外键作用是为了保证数据的参照完整性,但是这可以在业务层实现。

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


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值