数据库中多表连接的原理实现

数据库中多表连接的原理实现,第1张

多变关联的实现方式有hash join,merge join,nested loop join 方式,具体使用那种内型的连接,主要依据:

1.当前的优化器模式(all_rows和rule)

2.取决于表的大小

3.取决于关联字段是否有索性

4.取决于关联字段是否排序

Hash  join散列连接,优化器选择较小的表(数据量少的表)利用连接键(join key)在内存中建立散列表,将数据存储到hash列表中,然后扫描较大的表

select A.*,B.* from A left join B on a.id=b.id。

先是从A表读取一条记录,用on条件匹配B表的记录,行成n行(包括重复行)如果B表没有与匹配的数据,则select中B表的字段显示为空,接着读取A表的下一条记录,right join类似。

left join基本是A表全部扫描,在表关键中不建议使用子查询作为副表,比如select A.*,B.*from A left join (select * from b where b.type=1 )这样A表是全表扫描,B表也是全表扫描。若果查询慢,可以考虑关联的字段都建索引,将不必要的排序去掉,排序会导致运行慢很多。

主副表条件过滤:

table a(id, type):

id    type

----------------------------------

1      1       

2      1         

3      2   

表b结构和数据

table b(id, class):

id    class

---------------------------------

1      1

2      2

Sql语句1: select a.*, b.* from a left join b on a.id = b.id and a.type = 1

执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2

3        2

a.type=1没有起作用

sql语句2:

select a.*, b.* from a left join b on a.id = b.id where a.type = 1

执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2

sql语句3:

select a.*, b.* from a left join b on a.id = b.id and b.class = 1

执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1           

3        2

b.class=1条件过滤成功。

结论:left join中,左表(主表)的过滤条件在on后不起作用,需要在where中添加。右表(副表)的过滤条件在on后面起作用。

Mysql join原理:

Mysql join采用了Nested Loop join的算法,

###坐车 回去补充。

这篇文章主要介绍了PHP同时连接多个mysql数据库的具体实现,需要的朋友可以参考下

实例:

代码如下:

<?php

$conn1

=

mysql_connect("127.0.0.1",

"root","root","db1")

mysql_select_db("db1",

$conn1)

$conn2

=

mysql_connect("127.0.0.1",

"root","root","db2")

mysql_select_db("db2",

$conn2)

$sql

=

"select

*

from

ip"

$query

=

mysql_query($sql)

if($row

=

mysql_fetch_array($query))

echo

$row[0]."n"

$sql

=

"select

*

from

web

"

$query

=

mysql_query($sql)

if($row

=

mysql_fetch_array($query))

echo

$row[0]

?>

这段代码存在问题,在程序执行时会报错:PHP

Warning:

mysql_fetch_array()

expects

parameter

1

to

be

resource,

boolean

given

in

....

原因分析:

程序开始建立两个数据库链接,函数mysql_query()原型:

resource

mysql_query

(

string

$query

[,

resource

$link_identifier

]

)

向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定

link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用

mysql_connect()

函数来建立一个连接并使用之。查询结果会被缓存。

在本例中由于没有指定link_identifier,所以,在执行第一条sql时,默认使用的是上一个打开的链接,即$conn2,而实际上第一条sql语句应该使用的是$conn1,所以导致报错,所以为了能够链接多个mysql数据库,可以使用如下方法:

方法1:在mysql_query函数中指定所用连接,即:

代码如下:

<?php

$conn1

=

mysql_connect("127.0.0.1",

"root","root","db1")

mysql_select_db("Muma",

$conn1)

$conn2

=

mysql_connect("127.0.0.1",

"root","root","db2")

mysql_select_db("product",

$conn2)

$sql

=

"select

*

from

ip"

$query

=

mysql_query($sql,$conn1)

//添加连接$conn1

if($row

=

mysql_fetch_array($query))

echo

$row[0]."n"

$sql

=

"select

*

from

web

"

$query

=

mysql_query($sql,

$conn2)

if($row

=

mysql_fetch_array($query))

echo

$row[0]

?>

方法2:在sql语句中关联所用数据库,此时可以省略mysql_query的第二个参数,即:

代码如下:

<?php

$conn1

=

mysql_connect("127.0.0.1",

"root","root","db1")

mysql_select_db("db1",

$conn1)

$conn2

=

mysql_connect("127.0.0.1",

"root","root","db2")

mysql_select_db("db2",

$conn2)

$sql

=

"select

*

from

db1.ip"

//关联数据库

$query

=

mysql_query($sql)

if($row

=

mysql_fetch_array($query))

echo

$row[0]."n"

$sql

=

"select

*

from

db2.web

"

$query

=

mysql_query($sql)

if($row

=

mysql_fetch_array($query))

echo

$row[0]

?>

为了支持镜像环境的数据库交叉依赖,alwayson通过可用性组实现了多个数据库的同步备份在多个副本上,故障发生时,用户应用程序通过虚拟网络名称无缝连接到另一个副本的实例上,从而确保数据的实时在线。alwayson目前支持多个副本,一个主要副本(primary

replica),多个辅助副本(secondary

replicas),每个副本上的数据库都是可用的,在主要副本(primary

replica)上的数据库用户可以进行读\写 *** 作,在辅助副本(secondary

replicas)上可以进行读 *** 作,从而提高了数据库的可用性。


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

原文地址: http://outofmemory.cn/sjk/6802556.html

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

发表评论

登录后才能评论

评论列表(0条)

保存