【发布时间】:2011-04-16 22:34:27
【问题描述】:
我有一个复杂的数据库,大约有 30 个表。一个表有超过 500,000 行,另一个超过 15,000 行,我在一个单独的数据库中使用这两个表,直到今天我决定只在一个数据库中实现。
在今天之前,500,000 行的表在 MySQL 数据库中,而 15,000 行的表在 PostgreSQL 中。在一个频繁使用的页面中,这是 PHP 基准测试的结果:
getSimilarAvaiable - 0.0287 s
getUnavaiable - 0.27 s
ProcessDataOfUnavaiable - 1.4701 s
Process - 1.8622 s
TotalPageTime - 3.631 s
在我将所有内容迁移到 PostgreSQL 并使用相同的 SQL 代码而不做任何更改后,同一页面的结果是这样的:
getSimilarAvaiable - 2.7465 s
getUnavaiableCars - 9.0763 s
ProcesseDataOfUnavaiableCars - 1.4167 s
ProcessCars - 1.7207 s
TotalPageTime - 14.9602 s
我把所有东西都放在 MySQL 中,相同的索引,所有东西,但我不明白为什么会有这么大的差异。我应该怎么做才能优化它?
编辑:现在解释得更好了。
500.00 表由以下结构组成:
id - bigint (primary key)
plate- varchar(10) Unique key
manufacturer - varchar(30)
vin - varchar(30)
主要查询是这样的:
SELECT plate, vin, 1 as n, substr(plate,1,2) as l
FROM imtt_vin WHERE substr(plate,1,1) >= 'A' and substr(plate,1,1) <= 'Z' AND
(manufacturer ILIKE '%".self::$Manufacturer."%') AND vin LIKE ?
UNION
SELECT plate, vin, 3 as n, substr(plate,4,2) as l
FROM imtt_vin WHERE substr(plate,4,1) >= 'A' and substr(plate,4,1) <= 'Z' AND
(manufacturer ILIKE '%".self::$Manufacturer."%') AND vin LIKE ?
UNION
SELECT plate, vin, 2 as n, substr(plate,7,2) as l
FROM imtt_vin WHERE substr(plate,7,1) >= 'A' and substr(plate,7,1) <= 'Z' AND
(manufacturer ILIKE '%".self::$Manufacturer."%') AND vin LIKE ?
ORDER BY n, l, plate;
EDIT2:使用复杂的单个查询进行测试,我将其从 15 秒减少到 8/9 秒。即便如此,这对我来说也太过分了。
【问题讨论】:
-
@David Believe me 30 表和 500,000 行远非复杂 :)
-
你是在 MySQL 还是 InnoDB 中使用 MyISAM? MyISAM 速度更快,但支持的功能更少。
-
没有看到您的任何查询或涉及的表和索引的结构,任何人都很难帮助您。
-
使用 EXPLAIN 查看查询是如何执行的。也可以使用 substr() 创建一些索引,这可能会改善很多:EXPLAIN 会显示给你。
-
您的程序的版本?索引的定义? EXPLAIN / EXPLAIN ANALYZE 的输出?表只读?或者写操作的频率如何?
标签: mysql sql postgresql query-optimization database-performance