【问题标题】:Index length for city name field城市名称字段的索引长度
【发布时间】:2012-01-11 22:54:06
【问题描述】:

我有一张包含大约 1000 个城市的表格。有时,我需要按城市名称搜索,因此决定将其设为索引。决定索引长度的最佳做法是什么? 6 似乎是最佳选择,因为几乎没有重复。

示例表:

cityID  |  cityName         |  countyID
     1  |  Bethlehem        |     30
     2  |  Blairstown       |     38
     3  |  Bloomfield       |     32
     4  |  Bloomingdale     |     34
     5  |  Bloomsbury       |     30
     6  |  Bogota           |     31
     7  |  Boonton          |     33
     8  |  Botsford         |     44
     9  |  Bound Brook      |     35
    10  |  Branchburg       |     35
    11  |  Branchville      |     36
    12  |  Brantwood        |     32
    13  |  Briarcliff Manor |     25

cityID - 主键

countyID - 键

cityName (6) - 键

我这样做对吗?

当我尝试跑步时

EXPLAIN SELECT * 
FROM  'CITIES' 
WHERE  'cityName' =  'Branchburg'

我得到了以下结果:

id: 1
select_type: SIMPLE
table: CITIES
type: ref
possible_keys: cityName
key: cityName
key_len: 20
ref: const
rows: 2
Extra: Using where

“key_len”不应该是 6 吗?

【问题讨论】:

  • 列的字符集是什么?是 UTF-8 吗?

标签: mysql mysqli indexing database-design


【解决方案1】:

这取决于字符集。例如,如果您使用的是 utf8,它就像 6 * 3 = 18 ... 想,我不确定 2 个字节来自哪里

【讨论】:

  • 抱歉听起来像 n00b,但是字符集和排序规则一样吗?列排序规则是“utf8_unicode_ci”。
  • 在此处查看字符集和排序规则之间的区别:dev.mysql.com/doc/refman/5.0/en/charset-database.html,若要查找您的字符集,请查看此处:wincent.com/wiki/Finding_out_the_encoding_of_a_MySQL_database
  • 谢谢!看起来像它的utf8。这是否以某种方式解释了额外的 2 个字节?另外,我是否正确理解索引如何根据可能的重复来缩短索引?这是最佳做法吗?
  • 是的。实际上,您可以使索引更短,但在这种情况下,这将意味着 db 引擎将进行一些扫描。如果你想确定,只是不要指定索引长度...... 1000 行的表是相当小的表,我认为你不会注意到速度或索引大小的差异,无论你为索引放什么长度。
  • 感谢@vucetica,我知道在这种特殊情况下差异不会很明显,但我正在努力学习未来项目的最佳实践。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多