Mysql 什么时候应该使用sql视图
我们有一个表,其中有200万条记录,其中包含PK userid,而不是唯一的字段“Company”。我们每小时有35000条select query来检查数据库中是否存在userid,以及他与哪些公司有关 我们应该在主表上运行大量查询,还是应该创建一个只有userID和company字段的视图并对其运行查询 有什么好处和坏处 我将感谢你的帮助 附言 每小时35000个查询都是随机用户ID,并且每次都会更改。 用户id和公司没有更新,但我们每天增加大约20000行。Mysql 什么时候应该使用sql视图,mysql,sql,performance,Mysql,Sql,Performance,我们有一个表,其中有200万条记录,其中包含PK userid,而不是唯一的字段“Company”。我们每小时有35000条select query来检查数据库中是否存在userid,以及他与哪些公司有关 我们应该在主表上运行大量查询,还是应该创建一个只有userID和company字段的视图并对其运行查询 有什么好处和坏处 我将感谢你的帮助 附言 每小时35000个查询都是随机用户ID,并且每次都会更改。 用户id和公司没有更新,但我们每天增加大约20000行。 我主要关心的是最小化选择的响应
我主要关心的是最小化选择的响应时间,即使我更新了表的其他字段。视图仍会查询主表,因此没有性能改进。它们主要用于
我们需要知道您的担忧是什么,然后才能回答这两个方向的利弊。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数据库擅长的(或者应该擅长的,您可能需要测试您的具体场景)。