Mysql索引优化1

Btree索引和哈希索引(索引是一种数据结构,提高查询,排序,分组速度)

  • Btree索引的数据结构是平衡二叉树,时间复杂度为lgN
  • 哈希索引的数据结构是一个Hash函数,时间复杂度为O(1),数据输入Hash函数,输出一个数据行Address
    • 劣势:内存空间会有冗余不一定是紧密排列的;不利于范围查询;哈希地址冲突的问题(拉链算法)

常用联合索引的规则

  • 联合索引的创建并不是凭空的而是需要调研的
  • 假设index(a, b, c), 顺序很重要
  • where a = 1 and b = 2 and c = 4 (a,b,c都能用到索引)
  • where a = 3 and b = 4 (a,b能用到索引)
  • where b = 4 and a = 3 (a,b能用到索引)
  • where b = 5 and c = 4 (用不到索引)
  • where a = 1 and b like 'hello%' and c = 4 (a,b能用到索引c用不到)
  • where a = 1 and b like '%hello' (a能用到索引,b用不到索引)
  • group by b, c (b, c用到索引)
  • group by c, b (用不到索引)
  • 假设a,b,c三个字段对应三块木板,from a to b, 'hello%'走了木板的左半部分,所以用到了索引,‘%hello'走了木板的右半部分,所以不走索引,这个又称为索引的左前缀原则
  • where条件中如果有多个独立的索引,只能用上一个?

非聚簇索引和聚簇索引

  • 非聚簇索引对应myisam, 数据和索引二叉树是独立的文件,查数据先到索引二叉树,再到数据,索引指向行在磁盘上的位置,又称为回行
  • 聚簇索引对应innodb,数据和索引二叉树有关联,主键索引的叶子节点就直接放了数据本身,次级索引的叶子节点指向对主键的索引

聚簇索引导致的页分裂

  • 当insert的data主键毫无规律时,由于叶子节点存储着数据本身,会导致主键索引树节点变动较大,称为页分裂
  • 考虑一下两种情况,乱序插入myisam引擎,和乱序插入innodb引擎,当使用select * from t1时,innodb引擎对应的数据表查询结果会按顺序输出,虽然插入数据是无需的,但索引树本身是有序的;myisam引擎对应的数据表,因为没有使用where条件,所以怎么插入的就怎么输出,依然是乱序

非聚簇索引中的索引覆盖

  • 当要查询的列本身就是索引的一部分时,就不需要经过回行这个步骤了,又称之为索引覆盖;比如定义联合索引index(id, name), 执行select name from t1 where id = 1,则会using index

转载于:https://www.cnblogs.com/wjf0/p/8593916.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值