Mysql 什么时候应该使用sql视图

Mysql 什么时候应该使用sql视图,mysql,sql,performance,Mysql,Sql,Performance,我们有一个表,其中有200万条记录,其中包含PK userid,而不是唯一的字段“Company”。我们每小时有35000条select query来检查数据库中是否存在userid,以及他与哪些公司有关 我们应该在主表上运行大量查询,还是应该创建一个只有userID和company字段的视图并对其运行查询 有什么好处和坏处 我将感谢你的帮助 附言 每小时35000个查询都是随机用户ID,并且每次都会更改。 用户id和公司没有更新,但我们每天增加大约20000行。 我主要关心的是最小化选择的响应

我们有一个表,其中有200万条记录,其中包含PK userid,而不是唯一的字段“Company”。我们每小时有35000条select query来检查数据库中是否存在userid,以及他与哪些公司有关

我们应该在主表上运行大量查询,还是应该创建一个只有userID和company字段的视图并对其运行查询

有什么好处和坏处

我将感谢你的帮助

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

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

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

  • 我们需要知道您的担忧是什么,然后才能回答这两个方向的利弊。

    A
    视图
    只不过是
    可查询的查询
    。我建议您创建一个只包含userID和company字段的视图,并对其运行查询。但是,视图也将查询现有表

    关于使用视图,需要记住的一些
    要点是:

  • 视图实际上只是一个存储的选择状态
  • 视图的数据是视图引用的表的数据
  • 从当前版本开始,在视图上创建索引将不起作用
  • 如果使用合并算法,则底层表的索引将 被使用
  • 然而,基本指数并不可见。在视图上描述 将不显示索引列

  • 希望这有帮助。

    正如@dlgrasse所说的
    views
    对你没有帮助

    可以帮助您处理这35000个查询的方法是将大量查询存储在查询缓存中。如果在同一小时内,查询通常在同一用户上完成,则可能会发生这种情况。在查询缓存上运行查询的另一点是避免编辑这个大表中的(插入/更新/删除)行,每次编辑之后,来自查询缓存的所有查询都意味着这个表将无效


    因此,如果此表中的其他列需要做一些工作,但仍希望“快速查看”用户id和公司字段(移动不多),则可以创建一个专用表,仅包含这些字段,并且版本有限。

    创建视图没有帮助。每次使用它时,它都会简单地引用基础表

    可能有帮助的是在查询的列上创建覆盖索引。假设您只需要用户ID和公司:

     CREATE INDEX <Name> ON <Table> (UserID, Company)
    
    在(用户ID、公司)上创建索引
    
    现在,查询表单

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

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

    谢谢Dlgrase,我担心的是表格需要每小时更新500次,我不希望更新延迟选择,因为我需要快速响应。实际上,我使用视图的主要原因是对逻辑进行封装,这样我就可以在整个应用程序中使用该逻辑,而无需重复它。感谢AlphaMale,我关心的是表需要每小时更新500次,我不希望更新延迟选择,因为我需要快速响应。该视图在这里有用吗?谢谢regilero,表用户和公司没有变化,但我们每天都会添加大约20000个新条目。关于35000人,他们是非常随机的,每小时都可能不同。我可以在临时表中只缓存这两列吗?这会有帮助吗?如果整个表每天只更新一次,那么使用专用表将没有任何好处。使用大量RAM检查增益,并尝试将大部分数据放入innodb缓冲池大小如果我使用索引,表中其他字段的更新是否会导致select暂停?涉及用户ID或公司的更新,或者,任何INSERT或DELETE语句都需要更新索引,此时SELECT语句必须等待索引更新。但这种并发性正是SQL数据库擅长的(或者应该擅长的,您可能需要测试您的具体场景)。