
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的算法,
###坐车 回去补充。
方法如下:1、打开Microsoft Office Visio 2007,左侧的模板类别中选择“软件和数据库”,双击右侧的“数据库模型图”;
2、调整显示比例;
3、添加实体:鼠标指针移动到实体上,按下鼠标左键不要松开,移动鼠标到右侧的绘图页上,松开鼠标左键;
4、修改实体定义:去掉键入时同步的勾,输入物理名称和概念名称;
5、添加列:左侧类别选择“列”,右侧输入列名,选择数据类型,选择是否必须,是否主键。相同的方法添加“用户与角色关联表”;
6、添加关联关系:在左侧的关系上按下鼠标左键,拖动到右侧的“用户表”实体上,实体边框会变成红色,松开鼠标左键;
7、移动关系连接线的另一端关联到另一个实体上。左侧的数据库属性中就会显示对象关系。按此方法创建其它实体和关系;
8、保存文件:实体关系图设计好之后就可以保存了,为了以后可以继续修改,一定要保存为.vsd扩展名,如果为了方便查看,可以再另存为其它格式。
9、最终效果:
1、首先我们打开Workbench创一个建数据库(这里都使用闪电1执行选定命令行)。
2、先创建Student学生表。
3、再创建course课程表。
4、然后就可以创建sc关联表了我们先写上Student的主键和course的主键,并写上sc自己的属性成绩。
5、再写上主键约束,以及把sc表的学号属性和Studnet的学号关联、课程号属性和course的课程号关联。
6、再次运行就可以看到我们成功创建了学生表和课程表的关联表sc。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)