mysql 索引

1.索引

B*Tree索引 

b-tree -> b+tree(建立叶节点的双向连接) -> b*tree (建立叶节点和枝节点的双向连接)

聚簇索引B*tree 结构(Innodb独有)

簇?

区 extent ====>簇===>64个pages ===》1M

作用:有了聚簇索引之后,将来插入的数据行,在同一个区内,都会按照id值得顺序,有序的存储在磁盘上。

mysql innodb表 聚簇索引组织存储数据表

构建前提:

建表时:指定了主键列,mysql innodb会将主键作为聚簇索引列

没有指定主键,自动选择唯一(unique)的列,作为聚簇索引

以上都没有,生成隐藏聚簇索引

画图说明聚簇索引  


辅助索引btree结构:

说明:使用普通列作为条件构建的索引,需要认为创建

作用:非聚簇索引列之外的查询条件的优化

图解


辅助索引一般需要回表,也就是回到聚簇索引进行查询.

辅助索引分类:

单列索引:name

联合索引:

使用多列构建同一个索引

联合索引,注意最左原则 idx(a,b,c)

查询条件中,必须包含最左列 ,也就是a列

建立联合索引时,一定要选择重复值最少的列,作为最左列,

这样能筛选到最少的数据页.

全部覆盖:

select * from t1 where a =  and b= and c = 

select *from t1 where a= 

select *from t1 where a= and c =  c的索引不能走

select * from t1 where a=  and b > < >= <= like and c =   由于b出现了不等值的情况,

所以c的所以也不能走  

select xxx from t1 where  b order by a  不能走索引


前缀索引:

前缀索引是针对于,我们所选择的索引列值长度过长,会导致

索引的高度增高,导致需要读取更多的数据页,mysql中索引树高度3-4层。

所以可以选择大字段的前面部分字符作为索引的生成条件。

4 b+tree索引高度影响因素

1.索引字段较长:前缀索引

2.数据行过多 : 分区表,归档表(pt-archive),分布式架构

3.数据类型:变长使用vachar,选择合适的数据类型。


索引的管理命令

什么时候创建索引:

按照业务语句的需求创建合适的索引,并不是将所有的列都创建索引。

索引不是越多越好.

将索引建立在,经常where group by order by join on ....的条件.

为什么不能乱建索引?

如果冗余过多,表的数据变化时,很有可能导致索引频繁更新,会阻塞业务的

正常更新需求。

2.索引过多,会导致优化器的选择出现偏差。

管理命令:

建立索引:

查询表的索引情况: 

desc city;

key pri聚簇索引 mul辅助索引 uni 唯一索引

show index from  city;

添加索引

alter table city add index idx_na(name);

删除索引

alter table city drop index idx_na;

压力测试 

我这里有一张200万的表,用mysql工具进行压力测试;

mysqlslap --defaults-file=/etc/my.cnf \

--concurrency=50 --iterations=1 --create-schema='world' \

--query="select * from world.test1 where name='刘备999' " engine=innodb \

--number-of-queries=100 -uroot -pluobiao123 -verbose

备注:concurrency 代表用户  number-of-queries 代表执行次数 ,下面是花费时间:

Benchmark

Running for engine rbose

Average number of seconds to run all queries: 102.955 seconds

Minimum number of seconds to run all queries: 102.955 seconds

Maximum number of seconds to run all queries: 102.955 seconds

Number of clients running queries: 50

Average number of queries per client: 2

可以看到用了102秒 

下面创建索引再次执行: alter table world.test1 add index idx_na(name);

结果如下:

Benchmark

Running for engine rbose

Average number of seconds to run all queries: 0.026 seconds

Minimum number of seconds to run all queries: 0.026 seconds

Maximum number of seconds to run all queries: 0.026 seconds

Number of clients running queries: 50

Average number of queries per client: 2

共花费0.026秒,效率提升3923倍.


--创建联合索引

alter table city add index idx_c_n(name,countrycode);

--创建前缀索引

alter table city add index idx_du(district(5));--截取前5位

回表带来的影响:

1.oi量级变大

2.oips增大

3.随机io会增大

怎么减少回表

1.将查询尽量可能用主键进行查询

2.设计理想的合理的联合索引

3.更精确的查询条件+联合索引

4.优化器的算法:MRR

跟新数据时,会对索引有影响吗? 数据的变化索引会实时更新吗?

例如 insert  一行数据  

对于聚簇索引会立即更新。

对于辅助索引,不是实时更新的。

在innodb内存机构中加入了 insert buffer(会话),现在叫change buffer。

change buffer的功能是临时缓冲辅助索引需要的数据更新。

当我们需要查询新insert 数据,会在内存中进行merge(合并)操作,此时辅助索引就是最新的。

问题3:双11是怎么搞的,数据库?

提前1-2周将热点商品数据,灌入到tair(reidis)集群中.

KAFKA,核心:队列加缓存.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。比如,InnoDB的聚簇索引使用B+Tree的数据结构存储...
    sherlock_6981阅读 5,977评论 0 2
  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。比如,InnoDB的聚簇索引使用B+Tree的数据结构存储...
    大头8086阅读 17,651评论 7 40
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 8,164评论 0 8
  • 先来看个问题 假设现在有100000条从0到10000且从大到小排列的整型数据,1条数据的大小假设(真的只是假设)...
    kindol阅读 3,483评论 0 2
  • 我问睡莲:“睡莲,睡莲,你为什么这么好看?”睡莲回答我说:“绽放、绽放,尽管尽情绽放!”新一周的工作开始了,一切清...
    小胖儿_5b80阅读 1,405评论 0 1

友情链接更多精彩内容