建议“优化SQL查询的响应时间”

时间:2012-08-27 13:22:25

标签: mysql ruby-on-rails performance view query-optimization

我想知道为包含超过2.000.000条记录的表优化SQL查询响应时间的最佳解决方案

作为一个解决方案,我通过创建一个SQL视图来考虑虚拟表(实际上,我更喜欢使用mysql在今年创建的行中进行搜索,因为此应用程序的数据基于季节。)

是否有更好的解决方案或建议?

例如搜索所有租金线12

之前=> select * from rent_lines其中rent_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_lines

1 个答案:

答案 0 :(得分:1)

在这种情况下,视图并没有真正起作用。作为开发人员,视图主要通过让您按名称引用更复杂的查询而不必一直重复详细信息来帮助您。他们并没有真正帮助mysql。

你有很多选择。

  1. 如果您还没有,请确保您有一个索引,其中rent_id是索引中的唯一字段,或索引中的第一个字段。例如:

    create index rent_id_idx on rent_lines (rent_id)
    
  2. 你可以考虑在rent_id上使用mysql的分区系统和分区

  3. 您可以通过执行以下操作来创建具有较低基数的索引:

    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