首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql索引表

Mysql索引表
EN

Stack Overflow用户
提问于 2016-02-03 15:31:44
回答 2查看 41关注 0票数 0

我有一张桌子:

代码语言:javascript
复制
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 (城市)。

我使用它主要用于自动完成:当在一个输入中写入的东西时,两个输入都被填充。

以下是我的疑问:

代码语言:javascript
复制
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)

这两个字段都不是唯一的(法国城市可以共享相同的邮政编码)这个表几乎从来没有更新过,但是会执行很多选择。

你将如何索引这张表?

我读过很多关于索引的文章,但在真正使用索引之前,我想了解一些情况。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-03 22:37:58

最初选择是

代码语言:javascript
复制
INDEX(code_postal),
INDEX(ville)

一个用于一个查询,另一个用于另一个查询。

更好的选择是为每个查询提供一个“覆盖”索引:

代码语言:javascript
复制
INDEX(code_postal, ville),
INDEX(ville, code_postal)

关于索引的另一本食谱

建议在用户键入至少2个字符之前不要进行查找;在数千种选择中显示前20个字符是没有用的。

您没有在列/表上指定COLLATION,所以您可能有latin1_swedish_ci?实际上,这对您的法语应用程序来说可能是最好的,因为它是E=e=È=É=Ê=Ë=è=é=ê=ë之后的。(latin1_general_ci将事物视为单独的:E=e < È=è < É=é < Ê=ê < Ë=ë。)值得注意的是,瑞典排序规则包括N=n=Ñ=ñ

票数 1
EN

Stack Overflow用户

发布于 2016-02-03 15:39:35

要确定要创建哪些索引,您应该分析所有用例,而不仅仅是一个。

如果您只希望优化此查找功能,那么可以在code_postalville字段中创建单列索引。创建复合索引没有意义,因为如果复合索引字段是索引中最左边的字段,则mysql只能使用复合索引进行单个字段查找。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35181162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档