[英]Mysql indexing 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
%附加到:cp
或:ville
)
这两个字段都不是唯一的(法国城市可以共享相同的邮政编码)该表几乎永远不会更新,但是会执行很多选择。
您如何索引此表?
我已经阅读了很多有关索引的内容,但是在真正使用索引之前,我需要一些了解。
最初的选择是
INDEX(code_postal),
INDEX(ville)
一个对一个查询有效; 换另一个。
更好的选择是为每个查询提供“覆盖”索引:
INDEX(code_postal, ville),
INDEX(ville, code_postal)
建议您在用户键入至少两个字符之前不要执行查找; 在数千种选择中没有显示前20种是没有用的。
您没有在列/表上指定COLLATION
,所以您可能有latin1_swedish_ci
吗? 实际上,这可能是最适合您的法语应用程序,因为E=e=È=É=Ê=Ë=è=é=ê=ë
。 (latin1_general_ci将事物分开对待: E=e < È=è < É=é < Ê=ê < Ë=ë
。)值得注意的是,瑞典语归类包括N=n=Ñ=ñ
。
为了确定要创建哪些索引,您应该分析所有用例,而不仅仅是一个。
如果您只愿意优化此查找功能,则可以在code_postal
和ville
字段上创建单列索引。 创建复合索引是没有意义的,因为如果单个字段在该索引的最左侧,则mysql只能将复合索引用于单个字段查找。
由于这是一个相对较小的表,很少更新,因此我会毫不犹豫地使用索引。 使用mysql的explain select ...
命令来确认查询是否确实使用了新创建的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.