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:以上主要是针对单表,而多表联合查询,有很多地方需要考虑,如连接方式、查询表数据量分布、索引等,结合单表策略选择合适的关键词。