mysql不同存储引擎的表之间join 底层是如何实现的?

mysql不同存储引擎的表之间join 底层是如何实现的?,第1张

对于数据量很大的一张表,i/o效率底下,分表势在必行!

使用程序分,对不同的查询,分配到不同的子表中,是个解决方案,但要改代码,对查询不透明。

好在mysql 有两个解决方案:

Partition(分区,在MySQL 5.1.中实现) 和 Mysql Merge存储引擎。

本文讨论 Mysql Merge存储引擎。

CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20))

CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20))

INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1')

INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2')

CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST

对应定期分表的情况下,只要定期相应的增加一个基础表,再修改merge表中的 union 就行了(ALTER TABLE tbl_name UNION=(...))。

如在增加一个表(需和其他基础表一样的结构):

CREATE TABLE t3( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20))

ALTER TABLE total UNION=(t1,t2,t3)

INSERT_METHOD=LAST表示插入的方法,INSERT_METHOD的值可以是 FIRST(插入第一个表),LAST(最后一个表),NO(不能插入)

查询的时候,和平常一样

select * from total where ....

merge表会自动找到相应的基础表进行查询。

需要注意的是 merge表并不维护 “唯一性”检查,唯一性有各基础表完成。所以插入新的记录时候可能和其他基础表的内容重复。所以再插入去需要用代码进行唯一性检查。

最频繁使用的和重要的联接是INNER JOIN。它也被称为一个等值连接。

INNER JOIN通过结合基于联接谓词两个表(表1和表2)列值创建一个新的结果表。查询比较表1中的每一行与表2中的每一行,找到所有满足联接谓词的行。 当联接谓词被满足时,对于每个匹配的一对A和B的列值被组合成一个结果行。

INNER JOIN基本语法如下:

SELECT table1.column1, table2.column2...

FROM table1

INNER JOIN table2

ON table1.common_field = table2.common_field

select store_id,address from address inner join store on address.address_id=store.address_id

SQL LEFT JOIN返回所有行左表,即使存在左表中没有匹配。这意味着,如果在ON子句在右边的表匹配0(零)个记录,则连接将仍然在结果返回一行,但用NULL显示在右表中的每一列中。

这意味着,一个左连接从左表中返回所有值,再加上如果右表没有匹配就使用NULL值代替返回。

LEFT JOIN的基本语法如下:

SELECT table1.column1, table2.column2...

FROM table1

LEFT JOIN table2

ON table1.common_field = table2.common_field

在这里,给定的条件可能是根据您的需要任意给定表达式。

select address,store_id from address left join store on address.address_id=store.address_id limit 20

SQL RIGHT JOIN返回右表所有行,即使在左表中没有匹配。这意味着,如果ON子句匹配左表0(零)记录, 连接仍返回一行结果,但用NULL代替左表中的每一列。

这意味着,一个右连接返回右表所有的值,再加上如果没有匹配左表时使用NULL值。

RIGHT JOIN的基本语法如下:

SELECT table1.column1, table2.column2...

FROM table1

RIGHT JOIN table2

ON table1.common_field = table2.common_field

示例

select address,store_id from store right join address on address.address_id=store.address_id limit 10

从这一个开始,MySQL不提供正式的一步到位的关键字,效果全靠自己模拟。

左连接是得到A表中去除B表内容的剩下的部分,也就是A表独有的一部分。可以看做是在左外连接的结果中将双方共有的部分去掉得到的。

select address,store_id from address left join store on address.address_id=store.address_id where store_id is null limit 10

同理,右连接是在右外连接的结果中得到B表独有的那一部分

示例

select address,store_id from store right join address on address.address_id=store.address_id where store.store_id is null limit 10

全连接顾名思义是获得AB两表全部的数据,oracle提供了 full join关键字完成这一功能,但是MySQL没有。不过MySQL中可以借助union达到这个效果,union的作用是合并两个查询的结果。

两表的全连接中除去重合的部分,即两张表分别的特有部分的合集。

join 经常用来做关联查询,可以把两张或者多张表用通过关联条件关联起来做数据查询

在使用join查询的时候要区分主表和附表,jion ...on .....and

on: 表之间的关联条件

and:对附表做筛选

内连接,两个关联的表都为主表,所以他们的做条件筛选的顺序是:先连接,后筛选。此时 join ...on ... and =join...on... where ....

左连接,这时候左边的表就是主表,所以,主表的数据会全部展示出来,右边的表为附表,此时on连接后在通过and进行筛选的条件对主表不起作用,只对附表起作用。先筛选再连接

右连接,右边的表为主表,左边表变成附表,如果on后面又and 做筛选条件的话,和left join一样 也是先筛选后连接。


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

原文地址: http://outofmemory.cn/zaji/8693979.html

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

发表评论

登录后才能评论

评论列表(0条)

保存