我有这张 table :
CREATE TABLE `villes_france` (
`code_postal` varchar(10) NOT NULL DEFAULT '',
`code_insee` varchar(10) DEFAULT NULL,
`ville` varchar(255) DEFAULT NULL,
`region_rsi` varchar(2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
它包含 36826 行,每个法国城市一行。
这里有趣的字段是 code_postal
(邮政编码)和 ville
(城市)。
我主要将它用于自动完成:当在一个输入中写入某些内容时,两个输入都会被填充。
这是我的查询:
if($source == 'cp'){
$searchSQL = "SELECT code_postal as cp, ville FROM villes_france
WHERE code_postal LIKE :cp LIMIT 20";
}else{
$searchSQL = "SELECT code_postal as cp, ville FROM villes_france
WHERE ville LIKE :ville LIMIT 20";
}
(仅供引用,:cp
或 :ville
后附加“%”)
这两个字段都不是唯一的(法国城市可以共享相同的邮政编码) 该表几乎永远不会更新,但会执行大量选择。
您将如何索引该表?
我已经阅读了很多有关索引的内容,但在真正使用它们之前我想了解一些见解。
最佳答案
最初的选择是
INDEX(code_postal),
INDEX(ville)
一个适用于一个查询;另一个为另一个。
更好的选择是为每个查询提供“覆盖”索引:
INDEX(code_postal, ville),
INDEX(ville, code_postal)
Yet another cookbook on indexing .
建议您在用户输入至少 2 个字符之前不要进行查找;显示数千个选项中的前 20 个是没有用的。
您没有指定COLLATION
在列/表上,所以您可能有 latin1_swedish_ci
?它实际上可能最适合您的法语申请,因为E=e=È=É=Ê=Ë=è=é=ê=ë
。 (latin1_general_ci 将事物视为单独的: E=e < È=è < É=é < Ê=ê < Ë=ë
。)值得注意的是,瑞典语排序规则包括 N=n=Ñ=ñ
.
关于Mysql索引表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35181162/