繁体   English   中英

mysql以更快的方式?

[英]Mysql in a faster way?

我在MySQL数据库中有一个表:

  CodeNo Block
   a1     a
   a2     a
   b1     b
   b2     b
   c1     c
   c2     c 

我可以使用以下两种方法之一进行查询:

select codeno from mytab where block='b' and codeno like 'b%'

或者

select codeno from mytab where codeno like 'b%'

当mytab中有数百万条记录时,在实际情况下哪一个更快? 还有谁能解释它实际存储在数据库中的方式?

我认为两者都需要相同的时间,因为两者的执行计划是相同的

在此处输入图片说明

  1. 选择数据

  2. 表扫描100%

并查看执行计划的详细信息

在此处输入图片说明

在此处输入图片说明

如果没有看到执行计划,我会猜测第一个过滤器会减少设置第二个过滤器的记录数量,这会使第一个选项更快,特别是like运算符是一个字符串比较器,实际上并没有那么有效作为数字或二进制比较。

要了解更多信息,您可以生成两个语句的执行计划并比较运行时间,请查看文档

第一个查询应该更快,它通过使用块过滤器来限制结果。

我会说:在block上应用索引以提高速度。

ALTER TABLE mytab添加索引blockindex(block);

请参阅sqlfiddle并比较执行计划: http ://sqlfiddle.com/#!9/317d6/1

请参阅@juergend有关注释的评论。 问题是“取决于”。 如果在任何一个字段上都没有索引,则数据库将执行全表扫描,因此没有真正的区别。 如果codeno具有index和block则没有,那么这两个语句仍然大致相等,因为在两种情况下都将使用codeno上的索引。 如果在两个字段上都具有索引,则如果DB认为使用块索引进行首次访问会更有利,那么具有两个条件的字段可能会更快。 但是说明应该向您显示数据库决定用于访问计划的内容。

如果表上没有任何索引,则第一个查询将花费更多时间,这是因为无法从内存中获取任何内容,但是您必须检查两个字段而不是一个字段。

但是,当您可以添加自己的索引时,这种非规范化确实非常有用。 您可以仅添加(block)索引,以便在内存中进行相等性检查,第二条件的数据将从磁盘中获取,但仅针对与第一个条件匹配的那些行。 当匹配第一个条件的大多数行也匹配第二个条件时,这特别有用。

另一方面,您可以添加(codeno(1))索引,该索引将用于前缀检查,如codeno like 'b%' (确保在索引中指定足够长的前缀),这将几乎需要相同的时间。 在这种情况下,甚至不需要条件block='b'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM