我创建了下表:
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%"
任何提示都将受到赞赏。 谢谢
答案 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仍然可以作为有效的设计决定。