前段时间有个需求:在 MySQL 数据库里, 查找某个分类(包含其子分类 )产品 ,按照 创建时间倒序,分页取 20 条, 写出了类似这样的 sql:
select p.* from
product P
inner join
(
select
c.category_id
from
category c
join
category c2
on
c.parent_category_id = c2.category_id
join
category c3
on
c2.parent_category_id = c3.category_id
where
c.category_id = @category_id or
c2.category_id = @category_id or
c3.category_id = @category_id
) as C
on
P.category_id = C.category_id
order by P.create_time desc
limit 20
product 表,product_id(char(40)) 是主键,数据量,在 20k 左右,在 category_id(char(40)) 列,已经创建了 索引, category 表,category_id(char(40)) 是主键,总共只有 200 多条,
就这么个语句,MySQL 在我的开发机器上,执行了 16 到 25 秒 左右。
果断换 postgresql,每个表只有主键,未加其他索引 , 同样的数据量,同样的 sql 语句, 执行 30 到 40 毫秒 。
差异太明显了,所以,这个项目的 数据库改为 postgresql 了。
关于 mysql 和 postgresql ,以及上述的 sql 语句, 大家有什么想说的?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.