创建高性能的索引的一些策略

  • 独立的列和多列索引
    1、不要在多个列上建立单独的索引,单列的多个索引大部分情况下不能提升Mysql的查询性能。而是选择创建一个覆盖索引或者对索引列的顺序进行优化
    2、在一个多列的B-Tree索引中,索引列 的顺序意味着索引首先按照最左列进行排序,其次是第二列,等等。可以看出:索引可以按照升序或者降序进行扫描,来满足复合列顺序的Order by,group by 和distinct子句的查询。经验法则:将选择性最高的列放在前面(用于在where的条件查找)。
  • 覆盖索引
    如果一个索引包含(覆盖)所有需要查询的字段的值,称之为“覆盖索引”。可以看出,覆盖索引只能针对某个查询sql 的概念,例如这里写图片描述
    针对当前索引,sql 1:
    select biz_refund_id,pay_log_id from orders where biz_refund_id = ‘jhjhhj’ and pay_log_id = ‘7812jsda’。针对这个sql而言,索引’idx_pay_log_id_biz_refund_id’ 就是覆盖索引。
    而针对sql2:
    select biz_refund_id,pay_log_id,pay_memo from orders where biz_refund_id = ‘jhjhhj’ and pay_log_id = ‘7812jsda’。针对这个sql而言,索引’idx_pay_log_id_biz_refund_id’ 。则不是“覆盖索引”。
    覆盖索引的好处:
    1、索引条目通常远小于数据行大小,如果只需要读取索引,那mysql就会减少访问数据量。同时对缓存的负载非常重要,这种情况下,响应时间大部分花在数据拷贝上。覆盖索引对于I/O密集型的应用也有帮助,因为索引比数据更小,更容易放入内存中。
    2、针对InnoDB的聚簇索引,InnoDB的二级索引在叶子节点保存了行的主键值,所以如果二级主键能耐够覆盖查询,则币可以避免对主键索引的二次查询。因为如果查询的列不在索引中,则mysql还得根据索引去磁盘中去读取每一行的数据(根据索引去找,这通常是随机的I/O)
    注意:因为覆盖索引必须要存储索引列的值,而哈希索引,空间索引和全文索引都不存储索引列的值,所有不能作为覆盖索引。在Mysql中,只能使用B-Tree索引作为覆盖索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值