我有一个像这样的列的表:
| Country.Number | CountryName |
| US.01 | USA |
| US.02 | USA |
Run Code Online (Sandbox Code Playgroud)
我想将其修改为:
| Country | Number | CountryName |
| US | 01 | USA |
| US | 02 | USA |
Run Code Online (Sandbox Code Playgroud)
关于优化,如果我使用,性能是否有差异:
select * from mytable where country.number like "US.%"
Run Code Online (Sandbox Code Playgroud)
要么
select * from mytable where country = "US"
Run Code Online (Sandbox Code Playgroud)
后来的查询:
select * from mytable where country = "US"
Run Code Online (Sandbox Code Playgroud)
应该快得多,因为mySQL不必查找与LIKE查询不同的通配符模式.它只是寻找已经均衡的价值.
在这种特殊情况下,性能差异很可能是微不足道的,因为mysql使用索引"US.%".在搜索类似"%.US"(通配符在前面)之类的东西时,通常会感觉到性能下降.因为它然后在不使用索引的情况下进行表扫描.
编辑:你可以这样看:
MySql在内部存储varchar索引,如树,第一个符号是根,并分支到每个下一个字母.
因此,当搜索= "US"它寻找时U,然后向下一步S,然后另一步以确保它是值的结束.这是三个步骤.
然后再搜索LIKE "US.%"它然后然后停止搜索并显示结果 - 这也只是三个步骤,因为它不关心值是否在那里终止.US.
编辑2:我不会推广这样的数据库非规范化,我只是想引起你的注意,这个问题可能不像乍看之下那么简单.