MySQL中使用、或合并所有查询命令下的效率比较
什么是快速查询效率很多互联网上的声音都说,联盟的速度比或快,因为或可以导致全表扫描,他们给出了很多例子。
但是真正的工会真的比……更快吗
解释选择*从员工那里employees.first_name = 'georgi'union所有SELECT * FROM员工
这个语句执行的结果481,和执行时间为0.35s
主要员工全部300141用在哪里
工会雇员全部300141使用在哪里
联盟的结果
解释选择*从员工那里employees.first_name在('georgi ','bezalel)
这个语句的执行结果是0.186s
简单雇员全部300141使用在哪里
解释选择*从员工那里employees.first_name = 'georgi'or first_name = 'bezalel员工。
这句话的结果类似于
在网上出错了吗它与索引有关吗索引是建立在名
重新执行
该联盟的执行计划如下,和执行时间0.004s
初级员工编号index_firstname index_firstname 44常量253使用的地方
工会员工编号index_firstname index_firstname 44常量228使用的地方
联盟的结果
执行计划在如下,和执行时间0.004s
简单的员工范围index_firstname index_firstname 44481使用的地方
执行计划或如下,和执行时间0.004s
简单的员工范围index_firstname index_firstname 44481使用的地方
感觉相同,但是注意执行计划中的类型,REF优于范围(REF是一个非唯一索引扫描,范围是索引范围扫描)。
突然在互联网上它看起来像是一样的,但是第一个语句有两个REF扫描比一个距离扫描效率低。
或者我试试主钥匙,这是唯一的,它会在互联网上有效吗
解释选择*从员工那里的员工。emp_no = 100001联盟的所有选择*从员工那里
工会的执行计划如下
主要雇员常量主要小学4常量1
工会雇员常量小学小学4常量1
联盟的结果
解释选择*从员工那里employees.emp_no在(100001, 101100)
执行计划如下
简单雇员使用初级小学42。
解释选择雇员,雇员。emp_no = 100001或emp_no = 101100 *
执行计划或如下
简单雇员使用初级小学42。
感官结果与第二次实验相似。
在本文中,使用一个示例探讨实际查询命令之间的效率比较情况。
1:创建一个表,插入数据,数据量为1000万{无效果不明显}。
如果存在BT表;
创建表bt(
id int(10)不是null,
VName varchar(20)默认不空,
主键(id)
InnoDB引擎=);
该表只有两个字段:id、主关键字{索引页}和一个是普通字段(懒惰地使用简单的表结构)。
在bt表中插入1000万个数据
这里我写了一个简单的存储过程{所以你的MySQL版本至少是5,我的版本是5.1),代码如下。
注意:最好
插入Bt(ID,vname)值(I,concat(是的,我是1));
修改它
插入Bt(ID,vname)值(I,concat(是的,我,Tt));2
修改的原因是
非索引列和vname使用关节完全扫描,请使用1。
非索引列和vname使用全表扫描使用2。
如果程序存在test_proc滴;
创建程序test_proc()
开始
声明int默认为0;
设置自动提交= 0;
当我10000000岁时
插入Bt(ID,vname)值(I,concat(是的,我));
设置i = i + 1;
如果我2000 = 0然后
承诺;
最后如果;
结束的时候;
结束;
不写笔记很容易。
存储过程是对innob相关参数的最佳设置。它主要与日志和写缓存相关,可以加快插入速度。我没有在6分钟内插入1000万个数据。
一些数据如下:1000万数据是相似的。
2:实战
2.1:分别在索引列中使用或合并
我们创建的表只有主键索引,所以只能用ID.查询,我们查看98852209888589的id的三个数据,每个数据如下所示:
时间是0,怎么会这样,呵呵,所有的查询都在毫秒级。
我使用其他工具——mysql的SQL管理器
查询显示时间
93毫秒,93毫秒,94ms,时间的差异几乎可以忽略不计。
然后我们看看各自的执行计划。
此处要注意的字段类型和引用字段
我们发现,联合所有{类型使用的类型是用于显示的连接类型为},或在范围{连接类型优于范围,但没有太大的区别},查询行数是相同的{查看行字段都是3 }。
从整个过程来看,索引列中常量和OR和合并所有查询之间没有差别。
但是为什么在一些复杂的查询中,RE索引列的使用速度要慢,甚至要慢得多,这可能是因为您的查询不够合理,让MySQL放弃索引并扫描整个表。
2.2:在非索引列中使用、插入、合并。
我们看三个数据vname为M98,m85220,和m9888589如下:
我们发现为什么所有查询时间几乎是OR的三倍。
这就是为什么,我们不必说,首先看看三个查询计划。
在这里我们发现这个计划几乎是一样的。
但是我们必须注意在这个时间扫描或扫描只有一次表是行是9664782。
对于联合所有,表被扫描了三次,即行和9664782×3。
这就是为什么我们把工会看作是几乎三倍的原因。
注意:如果使用所有类型的第二个SQL执行计划使用存储过程,实际上这是我最想演示的,但是现在几乎写完了,发现错误了。
3:总结
3.1:不要迷信一切都快于或在中,要分析实际情况到底。
3.2:对于索引列,最好使用联合所有,因为复杂的查询,包括操作,将使或放弃索引并扫描整个表,除非您可以确定或将使用索引。
3.3:对于非索引字段,您可以诚实地使用或插入,因为非索引字段必须扫描整个表,而联合所有将增加表扫描次数。
3.4:当索引字段{索引字段有效}和非索引字段时,您也可以使用、插入、合并或合并所有内容。
但我建议使用或使用。
如有下列查询:
SELECT * FROM BT在bt.vname = 'm98'or bt.id = '9888589
SELECT * FROM BT在bt.vname = 'm98
联盟的所有
SELECT * FROM BT在bt.id = '9888589
两个查询的速度差异主要取决于索引列查询的长度,如索引列查询过长等。
3.5:以上主要是针对单表,而多表联合查询,有很多地方需要考虑,如连接方式、查询表数据量分布、索引等,结合单表策略选择合适的关键词。