【问题标题】:when should i use sql view我什么时候应该使用 sql 视图
【发布时间】:2011-12-27 15:49:29
【问题描述】:

我们有一个包含 200 万条记录的表,其中包含 PK 用户 ID 而不是唯一字段“公司”我们每小时有 35,000 个选择查询来检查我们的数据库中是否存在用户 ID 以及他与哪些公司相关。

我们应该在主表上运行大量查询,还是应该创建一个只有用户 ID 和公司字段的视图并针对它运行查询?

有什么好处和坏处?

感谢您的帮助!

附言 每小时 35,000 次查询是随机用户 ID,并且每次都更改。 用户 ID 和公司没有更新,但我们每天添加大约 20,000 行新行。 我主要关心的是最小化选择的响应时间,即使我更新了表的其他字段。

【问题讨论】:

    标签: mysql sql performance


    【解决方案1】:

    创建 VIEW 无济于事。每次使用它时它都会简单地引用基础表。

    可能有帮助的是在您查询的列上创建一个覆盖索引。假设您只需要 UserID 和 Company:

     CREATE INDEX <Name> ON <Table> (UserID, Company)
    

    现在,表单查询

    SELECT Company FROM <Table> WHERE UserID = <Value>
    

    可以从索引中得到满足,无需参考表数据。这可能会提高您的性能(在 SELECT 上)。

    【讨论】:

    • 如果我使用索引,表中其他字段的更新会导致选择停止吗?
    • 涉及 UserID 或 Company 的 UPDATE 或任何 INSERT 或 DELETE 语句都需要更新索引,并且此时的 SELECT 必须等待索引更新。但这种并发是 SQL 数据库擅长的(或者应该擅长,您可能需要测试您的确切场景)。
    【解决方案2】:

    视图仍将查询主表,因此没有性能改进。它们主要用于

    1. 仅对授权的行/列进行安全访问,
    2. 如果需要复杂的连接,请简化客户端 SQL。

    我们需要先了解您的顾虑,然后才能回答任一方向的利弊。

    【讨论】:

    • 感谢 dlgrasse,我担心表格需要每小时更新 500 次左右,我不希望更新延迟选择,因为我需要快速响应。
    • 实际上,我使用视图的主要原因是逻辑封装,这样我就可以在整个应用程序中使用该逻辑而无需重复。
    【解决方案3】:

    View 只不过是 queryable queries。我建议您应该创建一个仅包含用户 ID 和公司字段的视图并针对它运行查询。但是视图也会查询现有的表。

    关于使用视图要记住的一些 points 是:

    1. 视图实际上只不过是一个存储的选择语句
    2. 视图的数据是视图引用的表的数据。
    3. 在当前版本中无法在视图上创建索引
    4. 如果使用合并算法,则基础表的索引将 使用。
    5. 但是,底层索引是不可见的。描述一个视图 将不显示索引列。

    希望这会有所帮助。

    【讨论】:

    • 感谢 AlphaMale,我担心表格需要每小时更新 500 次,我不希望更新延迟选择,因为我需要快速响应。视图在这里有帮助吗?
    【解决方案4】:

    正如@dlgrasse 所说,views 不会帮助你。

    可以帮助您处理这 35000 个查询的是其中很多已经存储在查询缓存中。如果通常在同一小时内对同一用户进行查询,则可能会发生这种情况。让查询在查询缓存上运行的另一点是避免编辑(插入/更新/删除)此大表中的行,每次编辑后查询缓存中的所有查询都暗示此表将无效。

    因此,如果您在此表上还有其他列需要一些工作,但您仍希望在 user_id 和公司字段上获得“快速查看”,而这些字段不会移动很多,那么您可以创建一个专用表,仅包含这些字段,以及版本有限的地方。

    【讨论】:

    • 感谢 regilero ,表用户和公司没有改变,但我们每天都会添加大约 20,000 个新条目。关于 35,000 个,它们是非常随机的,并且每小时都可能不同。我可以在临时表中只缓存这两列吗?会有帮助吗?
    • 如果整个表每天只更新一次,那么使用专用表将没有任何好处。通过使用大量 RAM 来检查增益并尝试将大部分数据放在 innodb 缓冲池大小中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2011-06-23
    • 2012-09-22
    • 1970-01-01
    • 2012-12-23
    • 2021-07-13
    相关资源
    最近更新 更多