【问题标题】:Mysql indexing tableMysql索引表
【发布时间】:2016-02-03 15:31:44
【问题描述】:

我有这张桌子:

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 后附加一个“%”)

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

你会如何索引这个表?

我已经阅读了很多关于索引的内容,但在真正使用它们之前我想了解一下。

【问题讨论】:

标签: mysql indexing


【解决方案1】:

最初的选择是

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=Ñ=ñ

【讨论】:

  • 是的,它是 latin1_swedish_ci。我不知道这件事,这很有趣。它可能解释了为什么我的文件从一开始就不是 utf-8。如果我添加第三个字段并将 3 与 LEFT JOIN 一起使用怎么办?我应该为这 3 个字段的每个组合添加一个索引吗?谢谢
  • latin1 适用于西欧语言。 utf8 也可以使用,并且在您向东移动时成为一项要求。
  • 如果你有 3 个字段,那么,是的,3 个索引(不是 6 个)。这 3 个中的每一个都以 WHERE 子句正在使用的字段开头;其他两个字段只是标记,因为您将需要它们。不要过去,比如说,4。
  • 感谢您的宝贵意见。有很大帮助。你的食谱也很有趣
  • 食谱为我节省了很多打字时间——我回答了你的问题一半,然后将你指向食谱,希望它能解释我的答案并“下次”帮助你。
【解决方案2】:

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

如果您愿意仅优化此查找功能,请在 code_postalville 字段上创建单列索引。没有必要创建复合索引,因为 mysql 只能使用复合索引来查找单个字段,前提是该单个字段位于该索引中的最左侧。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多