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:ville 后附加“%”)

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

您将如何索引该表?

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

最佳答案

最初的选择是

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

关于Mysql索引表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35181162/

相关文章:

php - 提高mysql中的查询性能

mysql - InnoDB 的 LOAD INDEX INTO CACHE 替代品? MySQL

elasticsearch - 弹性-批量上传:索引x更新

opencv - 局部敏感哈希算法仅与opencv/flann中的二进制描述符兼容吗?

mysql - Slamdata:如何根据日期查找累计和

mysql - 单表和多表语法的区别?

php - 需要从一列中总结表中所有行中的数字

php - 我的查询哪里出了问题?

sql-server - SQL Server - 为我的表选择主键

c - 修改数组的选择元素