MySQL索引问题

时间:2014-07-20 15:47:02

标签: mysql query-performance

我创建了下表:

 CREATE TABLE citycodes
    (
     city VARCHAR(30),
     code VARCHAR(10),
     INDEX idx_code (code),
     INDEX idx_city (city)
    ) ENGINE=MyISAM;

我知道由于缺乏索引,此查询的性能会很差。

SELECT city FROM citycodes WHERE code = 37040

但是我通过这样做改进了选择: 我在城市列中添加了一个主键。我应该像这样运行我的查询:

SELECT city, code FROM citycodes WHERE code = "37040" AND city LIKE "C%"

任何提示都将受到赞赏。 谢谢

1 个答案:

答案 0 :(得分:1)

以下是一些提高该表性能的提示:

city VARCHAR(30),

您可以考虑将此VARCHAR更改为CHAR字段。数据库的大小会有所增加,但除非您拥有数据库中世界上的每个大都市,城镇和泥屋村,否则它的存储空间不会超过MiB,但可能increase indexing performance by up to 20%

code VARCHAR(10),

在您的示例中,您提供的代码是数字,那么为什么不使用INT(或其他整数数据类型)呢?结果,你会看到另一个显着的性能提升。

INDEX idx_code (code),
INDEX idx_city (city)

PRIMARY KEY放在将更频繁查询的列上(或者,如果有疑问,请使用较小的数字字段code)。请注意,这意味着该列中的值必须为UNIQUE。如果您要查询其他字段(即根据其名称确定城市代码),也可以添加KEY

  

)ENGINE = MyISAM;

MyISAM确实可能用于此目的,因为该表可能读取很重,不需要锁定,并且(如果您注意我的上述注释)将具有固定长度的行。

以下是修改后的表定义:

CREATE TABLE citycodes (
    code INT PRIMARY KEY,
    city CHAR(30),
    KEY(city)
) ENGINE = MyISAM;

最后但同样重要的是,请考虑您的算法:

这是一个非常简单的键/值表,可能是一个非常小的表。如果您关注这里的表现,也许更谨慎的问题是,“为什么这个表格的表现对我的申请非常重要?”

查看您的算法,并查看您正在进行的查询的类型和数量。即使您优化此查询以在一半的时间内运行,例如,如果您在循环中运行SELECT数千次,那么它仍然会非常慢。优化查询的最佳方法是更改​​算法,这样您就不必运行查询了。 (或者只运行一次,并将完整的结果缓存到您的应用程序中,在您的语言的本机数据结构中访问速度会快得多)。

如果您很少直接查询此表,而是拉入JOIN中的列,则可以考虑对表架构进行反规范化,只需在其他表中使用city名称( s)需要它。除非绝对必要,否则我不建议这样做,因为它可能会显着增加其他表的存储要求,并且如果您的某个城市更改了其名称,则需要进行大量UPDATE次查询。但是,如果仔细考虑,de-normalization仍然可以作为有效的设计决定。