MySQL 索引合并(Index Merge)优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 索引合并(Index Merge)优化相关的知识,希望对你有一定的参考价值。
参考技术A 索引合并检索方法可以检索多个范围扫描并将结果合并。这种访问方法只能合并同一个表的索引扫描,不能合并跨表扫描。合并可能生成基础扫描结果的"并集","交集",或者"交集的并集"
示例:
这种方法适用于 WHERE 子句中的条件是通过 AND 结合的不同索引的范围条件时,其中的每个条件都需要满足下列条件之一:
示例:
索引合并交集算法在所有使用的索引上同时进行扫描,并从扫描结果中生成行的交集
如果查询中的所有列都被使用的索引覆盖,不需要检索所有表行( EXPLAIN 输出中的 Extra 列中包括 Using index )。例如这个语句:
SELECT COUNT(*) FROM t1 WHERE key1 = 1 AND key2 = 1;
如果使用的索引没有覆盖查询中所有的行,只有当所有使用的索引的范围条件满足时才检索整个行。
如果合并条件中包括 Innodb 表主键索引条件,主键并不用来检索数据,而是用来筛选使用其他条件检索出的行。 # 就是先通过其他的范围条件筛选出一部分数据,在从这部分数据中,通过主键来筛选出最终的结果
这种方法适用于 WHERE 子句中的条件是通过 OR 结合的不同索引的范围条件时,其中的每个条件都需要满足下列条件之一:
示例:
这种方法适用于 WHERE 子句中的条件是通过 OR 结合的不同索引的范围条件,但是不能使用 Index Merge Union 算法的情景
示例:
sort_union 和 union 算法的区别是, sort_union 必须在返回行数据前先获取行ID并对行ID进行排序。
在 optimizer_swith 中有4个关于 Index Merge 的变量:
index_merge,index_merge_intersection,index_merge_union,index_merge_sort_union
默认情况下都是启用的。要单独启用某个算法,设置 index_merge=off ,并将相应的标志设置为 on
Python pd.merge函数通过索引横向合并csv文件
1.pd.merge函数介绍
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
参考原文:原文很详细,本文增加多重索引合并内容。【python】详解pandas库的pd.merge函数_brucewong0516的博客-CSDN博客_merge函数
参数如下:
- left: 拼接的左侧DataFrame对象
- right: 拼接的右侧DataFrame对象
- on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
- left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
- right_on: 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
- left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
- right_index: 与left_index功能相似。
- how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
- sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
- suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
- copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
- indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。
2.单索引列合并
当使用的索引列为字段唯一值的时候,仅使用唯一一个列就可以有效合并,这里使用how属性选择inner,取交集结果,以减少数据量。
import pandas as pd
# 读取数据
r1 = pd.read_csv(r"test1.csv", encoding='gbk') # 文件1
r2 = pd.read_csv(r"test2.csv", encoding='gbk') # 文件2
# 数据合并
all_data_st = pd.merge(r1, r2, how='inner', left_on=['columnname'], right_on=['columnname'])
# 导出结果数据
all_data_st.to_csv(r"out.csv", index=False,encoding='gbk')
3.多重索引列合并
当使用的索引列为字段值不唯一的时候,我们可以增加列来组合条件进行数据合并,具体代码如下,增加了,'columnname1'条件进行筛选合并:
import pandas as pd
# 读取数据
r1 = pd.read_csv(r"test1.csv", encoding='gbk') # 文件1
r2 = pd.read_csv(r"test2.csv", encoding='gbk') # 文件2
# 数据合并
all_data_st = pd.merge(r1, r2, how='inner', left_on=['columnname','columnname1'], right_on=['columnname','columnname1'])
# 导出结果数据
all_data_st.to_csv(r"out.csv", index=False,encoding='gbk')
以上是关于MySQL 索引合并(Index Merge)优化的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 优化器之Index merge Multi-Range Read MRR与Batched Key Access使用案例详解
Python pd.merge函数通过索引横向合并csv文件