建议“优化 SQL 查询的响应时间”
Posted
技术标签:
【中文标题】建议“优化 SQL 查询的响应时间”【英文标题】:Recommendation "to optimize the response time of an SQL query" 【发布时间】:2012-08-27 13:22:25 【问题描述】:我想知道对于包含超过 2.000.000 条记录的表优化 SQL 查询的响应时间的最佳解决方案是什么
作为一个解决方案,我想到了一个虚拟表,通过创建一个SQL视图(实际上我更喜欢mysql在今年创建的行中搜索早期,因为这个应用程序的数据是基于季节的。)
有没有更好的解决方案或建议?
例如搜索租金 12 的所有租金行
之前 => select * fromrent_lines whererent_id = 12
现在 => 我创建了一个视图
CREATE VIEW v_rent_lines
AS SELECT rent_id, category_id, customer_id, amount ..
Where rent_lines FROM created_at > = (select starts_on from seasons where current = true)
select * from v_rent_lines Where rent_id = 12
注意事项:
数据库引擎正在使用 InnoDB
我添加了索引表(index_rent_lines_on_rent_id、index_rent_lines_on_category_id、index_rent_lines_on_customer_id)
rent 有很多rent_lines
【问题讨论】:
我们需要更多细节来处理。向我们展示有问题的查询。给我们所涉及的表的架构。 这实际上取决于您的数据库结构以及您要执行的查询。另外:“什么是最好的 X”问题往往在这里被关闭,因为它们没有确切的答案并导致无休止的讨论。请尽量让您的问题更具体。 通常最简单的解决方案是添加索引并启用 sql 引擎缓存(例如查询缓存),但它仅适用于 SELECT 查询。如果您的 SELECT/INSERT 比率小于 1000/1,答案就不那么简单了。 我添加了其他信息 thx @SlimTekaya 我们仍然需要查看架构和索引。 【参考方案1】:在这种情况下,视图并没有真正帮助任何事情。作为开发人员,视图主要通过让您按名称引用更复杂的查询而不是一直重复详细信息来帮助您。它们对 mysql 的帮助并没有那么大。
你有很多选择。
如果您还没有,请确保您有一个索引,其中rent_id 是索引中的唯一字段,或者是索引中的第一个字段。例如:
create index rent_id_idx on rent_lines (rent_id)
可以考虑使用mysql的分区系统,在rent_id上进行分区
您可以通过执行以下操作来创建具有较低基数的索引:
alter table rent_lines add rent_id_bucket smallint unsigned not null after rent_id;
update rent_lines set rent_id_bucket = rent_id>>16;
alter table rent_lines add key rent_id_bucket_idx(rent_id_bucket);
这将让您执行如下查询:
select * from rent_lines where rent_id_bucket = 16>>16 and rent_id=16
【讨论】:
以上是关于建议“优化 SQL 查询的响应时间”的主要内容,如果未能解决你的问题,请参考以下文章