理解mysql_索引的原理及优化技巧

innodb的索引: 
  ●   innodb采用索引组织数据的形式,它是在存储引擎层面实现的,与后端的服务器层没有关联。不同的存储引擎有不同的实现算法。 
  
  ● 索引的原理 
           索引采用b tree(平衡树)树的形式保存,所以是有顺序的。 
           索引的数据存储在表空间(tablespace)里面, 
           聚集索引(主键索引)上面存储了整个行的数据,而辅助索引上面仅存了指向主键的指针,因此辅助索引查询效率要低于主键索引1倍。 
             在插入和删除的时候性能比较低,需要维护平衡树。 
               
  ●  索引的分类: 
  1.   聚集索引(主键索引), 一个表只允许一个主键索引,以b+树结构存储, 索引上面已经存储了数据。查询的时间复杂度为树的高度 
  2.   辅助索引, 存储了主键的指向,查询时需要先找到辅助索引,然后根据辅助索引的值找到主键索引,然后再获取数据 
  3.   联合索引, 最左原则 
             因为右边的索引在建索引的时候没有顺序,所以会全表扫描。 
             mysql目前还做不到松散索引扫描 
  4.   倒排索引, 将text分词得出很多小片段的词组,对这些词组进行索引 
  5.   自适应hash索引。 
  6.   覆盖索引 
             select 中的字段在索引里面,不需要到再一次到聚集索引中去获取值 
             用explain查询,可以看到extra标注:using index 

  ● 优化点 
  1.  索引是字符串,但是查询时没有带单引号 ' ' 
  2. 一条sql只能走一个索引, 如果走多个索引建议用联合索引 
  3.  优化过程中优先考虑使用到聚集索引和覆盖索引,这能很大程度上提高效率 
  4.  建议少用in,尤其是嵌套子查询,因为那样的话外部表会做全表扫描,可以用表关联 
            exists 和 in 能够很好的去除,不需要distinct、group,避免了临时表的创建,效率有时会比较高 
           是不是一定要禁止使用子查询(如exists、in), 这要看场景,因为用inner join 容易 出现重复记录,剔重需要用distcint,会影响到效率。 
          什么情况下会产生临时表? 
       5. min\max巧用主键索引 
       6. 巧用子查询更新表记录 
            update t  inner join (select id, count(1) count from t2 group by id) t3 set t.max_value = t3.count 
       

        索引类型越小越好,对于大数据处理来说,这个可不是小事,从字符串替换为数字类型,可以极大地节省内存、磁盘存储以及网络带宽,减少IO的代价,而且很多数据结构和算法使用数字类型比字符串要更快
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值