MySQL 优化器针对索引的算法

优化器针对索引的算法
自优化能力:
3.1 MySQL索引的自优化-AHI(自适应HASH索引)MySQL的InnoDB引擎,能够创建只有Btree。AHI作用: 自动评估"热"的内存索引page,生成HASH索引表。帮助InnoDB快速读取索引页。加快索引读取的所读。相当与索引的索引。
3.2 MySQL索引的自优化-Change buffer比如insert,update,delete 数据。对于聚簇索引会立即更新。对于辅助索引,不是实时更新的。在InnoDB 内存结构中,加入了insert buffer(会话),现在版本叫change buffer。Change buffer 功能是临时缓冲辅助索引需要的数据更新。当我们需要查询新insert 的数据,会在内存中进行merge(合并)操作,此时辅助索引就是最新的。
优化器算法介绍:
查询:mysql> select @@optimizer_switch;
| @@optimizer_switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on |
如何修改?

  1. 修改配置文件my.cnf
  2. set global optimizer_switch=‘batched_key_access=off’;
  3. hintsSELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) / f1FROM t3 WHERE f1 > 30 AND f1 < 33;SELECT /+ BKA(t1) NO_BKA(t2) / * FROM t1 INNER JOIN t2 WHERE …;SELECT /+ NO_ICP(t1, t2) / * FROM t1 INNER JOIN t2 WHERE …;SELECT /+ SEMIJOIN(FIRSTMATCH, LOOSESCAN) / * FROM t1 …;EXPLAIN SELECT /+ NO_ICP(t1) */ * FROM t1 WHERE …;
    https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html
    3.3 ICP 索引下推
    作用: 解决了,联合索引只能部分应用情况。为了使减少没必要的数据页被扫描。将不走索引的条件,在engine层取数据之前先做c二次过滤。一些无关数据就会被提前过滤掉。index(a,b,c)select * from t1 where a= and c=
    3.4 MRR muti range readmysql> set global optimizer_switch=‘mrr=on,mrr_cost_based=off’;
    辅助索引 —回表----》 聚簇索引转换为辅助索引 —>sort id --回表–> 聚簇索引
    3.5 SNLJ例子: A join B on A.xx = B.yy where a.zz=xxxx伪代码:for each row in A matching range {block for each row in B { A.xx = B.yy ,send to client } }
    以上例子,可以通过 left join 强制驱动表。

3.6 BNLJ
在 A和B关联条件匹配时,不再一次一次进行循环。而是采用一次性将驱动表的关联值和非驱动表匹配.一次性返回结果主要优化了, CPU消耗,减少了IO次数
In EXPLAIN output, use of BNL for a table is signified when the Extra value contains Using join buffer (Block Nested Loop)

3.7 BKA 看图说话。
主要作用,使用来优化非驱动表的关联列有辅助索引。BNL+ MRR的功能。开启方式: mysql> set global optimizer_switch=‘mrr=on,mrr_cost_based=off’;mysql> set global optimizer_switch=‘batched_key_access=on’;重新登陆生效。

你可能感兴趣的:(MySQL,索引,mysql)