MySQL优化,“喜欢”vs“=”

时间:2010-08-26 15:41:03

标签: mysql

我有一个包含这样的列的表:

| Country.Number | CountryName |
| US.01          | USA     |
| US.02          | USA     |

我想将其修改为:

| Country | Number | CountryName |
| US      | 01     | USA     |
| US      | 02     | USA     |

关于优化,如果我使用以下是性能上的差异:

select * from mytable where country.number like "US.%"

select * from mytable where country = "US"

6 个答案:

答案 0 :(得分:7)

后来的查询:

select * from mytable where country = "US"

应该 更快 ,因为mySQL不必查找与LIKE查询不同的通配符模式。它只是寻找已经均衡的值。

答案 1 :(得分:7)

在这种特殊情况下,性能差异最有可能是微不足道的,因为mysql使用"US.%"上的索引。在搜索"%.US"之类的内容时(通配符位于前面),通常会感觉到性能下降。因为它可以在不使用索引的情况下进行表格扫描。

编辑:你可以这样看:

MySql在内部存储varchar索引,例如树,第一个符号是根,并分支到每个下一个字母。

因此,当搜索= "US"时,它会查找U,然后向下移动S,然后向下移动另一步以确保该值是值的结尾。这是三个步骤。

搜索LIKE "US.%"它再次查找U,然后S,然后.,然后停止搜索并显示结果 - 这也只是因为它关心的三个步骤而不是价值终止于那里。

EDIT2 :我不会推广这样的数据库非规范化,我只是想引起你的注意,这个问题可能不像初看起来那么简单。

答案 2 :(得分:4)

如果您需要进行优化,则简单=优于like

为什么?

  • 使用=或者字符串完全相同而且它是真的或者它不匹配而且它是假的。
  • 如果有的话,MySQL必须比较字符串并测试另一个字符串是否与掩码匹配,这需要更多时间并需要更多操作。

因此,为了您的数据库,请使用SELECT * FROM 'mytable' WHERE country = "US"

答案 3 :(得分:3)

如果列国家/地区有索引,则第二个会更快。 MySQL必须扫描较少的索引条目才能产生结果。

答案 4 :(得分:2)

从技术上讲,这个问题的答案并不是......但是......我会理解它们的速度足够接近而不是(通常)很重要 - 因此使用“=”会更好,因为它显示了意图更明显的方式。

答案 5 :(得分:1)

为什么不让country_id成为一个未签名的tinyint并且拥有一个唯一的iso_code varchar(3)列? (将您从所有BS中拯救出来)