我有一张桌子:
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 (zipcode)和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";
}(FYI a "%“附加于:cp或:ville)
这两个字段都不是唯一的(法国城市可以共享相同的邮政编码)这个表几乎从来没有更新过,但是会执行很多选择。
你将如何索引这张表?
我读过很多关于索引的文章,但在真正使用索引之前,我想了解一些情况。
发布于 2016-02-03 22:37:58
最初选择是
INDEX(code_postal),
INDEX(ville)一个用于一个查询,另一个用于另一个查询。
更好的选择是为每个查询提供一个“覆盖”索引:
INDEX(code_postal, ville),
INDEX(ville, code_postal)关于索引的另一本食谱。
建议在用户键入至少2个字符之前不要进行查找;在数千种选择中显示前20个字符是没有用的。
您没有在列/表上指定COLLATION,所以您可能有latin1_swedish_ci?实际上,这对您的法语应用程序来说可能是最好的,因为它是E=e=È=É=Ê=Ë=è=é=ê=ë之后的。(latin1_general_ci将事物视为单独的:E=e < È=è < É=é < Ê=ê < Ë=ë。)值得注意的是,瑞典排序规则包括N=n=Ñ=ñ。
发布于 2016-02-03 15:39:35
要确定要创建哪些索引,您应该分析所有用例,而不仅仅是一个。
如果您只希望优化此查找功能,那么可以在code_postal和ville字段中创建单列索引。创建复合索引没有意义,因为如果复合索引字段是索引中最左边的字段,则mysql只能使用复合索引进行单个字段查找。
由于这是一个相对较小的表,很少更新,所以我会毫不犹豫地使用索引。使用mysql的explain select ...命令确认查询是否确实使用了新创建的索引。
https://stackoverflow.com/questions/35181162
复制相似问题