繁体   English   中英

MySQL索引表

[英]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_postalville字段上创建单列索引。 创建复合索引是没有意义的,因为如果单个字段在该索引的最左侧,则mysql只能将复合索引用于单个字段查找。

由于这是一个相对较小的表,很少更新,因此我会毫不犹豫地使用索引。 使用mysql的explain select ...命令来确认查询是否确实使用了新创建的索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM