美文网首页
mysql 索引

mysql 索引

作者: later02 | 来源:发表于2020-03-19 14:03 被阅读0次

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,核心:队列加缓存.

相关文章

  • MySQL索引及查询优化书目录

    MySQL索引的原理之索引目的 MySQL索引的原理之索引原理 MySQL索引的原理之索引的类型 MySQL索引的...

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • MySQL索引的使用

    MySQL索引 MySQL索引可以快速提高MySQL的检索速度。索引分单列索引和组合索引单列索引:即一个索引只包含...

  • Mysql索引与锁

    本文以Mysql5.7为例测试。 1:mysql索引方法 Mysql的索引方法分为btree索引和hash索引。 ...

  • 索引(二)

    mysql索引的新手入门详解mysql索引之三:索引使用注意规则 索引(Index)是帮助 MySQL 高效获取数...

  • MySQL 索引分类

    MySQL索引的分类(根据数据结构) 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL...

  • MySQL--索引

    MySQL索引 查看索引 创建索引 创建唯一索引 创建主键索引 删除索引 删除主键 MySQL视图 创建视图 删除...

  • mysql索引

    索引 mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索速度。索引分单列索引...

  • 5.2MySQL创建高性能索引考察点

    MySQL索引的基础和类型延伸:MySQL索引的创建原则延伸:MySQL索引的注意事项 索引的基础索引类似于书籍的...

  • MySql 数据查询优化

    1. MySQL索引类型: mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。...

网友评论

      本文标题:mysql 索引

      本文链接:https://www.haomeiwen.com/subject/vkflyhtx.html