mysql怎么做merge分表

mysql怎么做merge分表,第1张

mysql merge分表 *** 作

三个分表:

www.2cto.com

CREATE TABLE `test_1` (

id INT(11) NOT NULL DEFAULT '0',

email varchar(50) NOT NULL ,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=UTF8

CREATE TABLE `test_2` (

id INT(11) NOT NULL DEFAULT '0',

email varchar(50) NOT NULL ,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=UTF8

CREATE TABLE `test_3` (

id INT(11) NOT NULL DEFAULT '0',

email varchar(50) NOT NULL ,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=UTF8

一个总表: www.2cto.com

CREATE TABLE `test` (

`id` INT(11) NOT NULL DEFAULT '0'

email varchar(50) NOT NULL

key `i_id` (`id`),

) ENGINE=MRG_MyISAM UNION=(test_1,test_2,test_3) DEFAULT CHARSET=UTF8

在总表test上面select *的话,会取出三个分表中的数据。

在插入数据的时候根据对象的hash code 取模运算,如果余数为 3 那么就插入 test_3 这个表中。

索引合并检索方法可以检索多个范围扫描并将结果合并。这种访问方法只能合并同一个表的索引扫描,不能合并跨表扫描。

合并可能生成基础扫描结果的"并集","交集",或者"交集的并集"

示例:

这种方法适用于 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

使用视图的两种算法merge和temptable分别统计

表tb_phone中market_price大于4000的手机,然后查询视图查找出小于6000的手机

简单总结最终获取的结果:查询出market_price大于4000且小于6000的手机

表数据:

merge合并算法

合并的执行方式,每当执行的时候,先将视图的sql语句与外部查询视图的sql语句,合并在一起,最终执行.

以下是使用常规select语句模拟合并算法:

执行结果模拟与算法的结果相同:

temptable临时表算法

先执行视图再执行其他 *** 作的查询

临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当前的临时表内进行查询

以下是使用常规select语句模拟临时表算法:

执行结果模拟与算法的结果相同:

比较两种算法结果也相同,似乎是这样的,接下来的实例将不同

实例2

使用视图的两种算法merge和temptable分别统计

表tb_phone , 同类(cid)手机的最高价格(market_price)的产品

表数据:

首先可以考虑基本select语句的实现方式(这里就不再赘述):

先排序再分组

接下来使用两种算法:

merge合并算法

最后一句select模拟合并算法有语法错误的,order by 不能在 group by之前,这时执行会报错,但在视图中不会报错,而是直接跳过了错误部分order by 直接执行了

select * from tb_phone group by cid

最终结果(错误):

temptable临时表算法

发现执行结果与普通语句相同,模拟的语句同样正确

最终结果(正确):


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/8634017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存