我有一个包含这样的列的表:
| 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"
答案 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
。
为什么?
=
或者字符串完全相同而且它是真的或者它不匹配而且它是假的。因此,为了您的数据库,请使用SELECT * FROM 'mytable' WHERE country = "US"
。
答案 3 :(得分:3)
如果列国家/地区有索引,则第二个会更快。 MySQL必须扫描较少的索引条目才能产生结果。
答案 4 :(得分:2)
从技术上讲,这个问题的答案并不是......但是......我会理解它们的速度足够接近而不是(通常)很重要 - 因此使用“=”会更好,因为它显示了意图更明显的方式。
答案 5 :(得分:1)
为什么不让country_id成为一个未签名的tinyint并且拥有一个唯一的iso_code varchar(3)列? (将您从所有BS中拯救出来)