Mysql 查询性能中的SQL-最好将其拆分或不拆分
我从另一台服务器获取多达1000个id,以便向访问者显示它们,因此我必须在查询中使用如下内容:Mysql 查询性能中的SQL-最好将其拆分或不拆分,mysql,sql,performance,Mysql,Sql,Performance,我从另一台服务器获取多达1000个id,以便向访问者显示它们,因此我必须在查询中使用如下内容: SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....) // and so on, up to 1000 假设有1/3的访客会观看所有1000个id,而2/3的访客只会观看前50个id 对于性能/工作负载来说,一个查询可以查询所有1000个id,还是将它们分成20个查询,每个查询50个id?因此,当前50个被观看时,查询下一个5
SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....) // and so on, up to 1000
假设有1/3的访客会观看所有1000个id,而2/3的访客只会观看前50个id
对于性能/工作负载来说,一个查询可以查询所有1000个id,还是将它们分成20个查询,每个查询50个id?因此,当前50个被观看时,查询下一个50个,以此类推
编辑:
拆分时我不需要使用限制,这意味着查询中的id最多为50个。那么更好的是,一次查询1000个id,或者每50个id查询20个
编辑:
好吧,我简短而直接地问:一个查询中1000个id不是太多吗?我在这里读到了很多不好的地方,你可以看看这里提供的答案: 使用LIMIT语句,您只能返回结果的一部分。通过更改LIMIT语句中的参数,可以重用查询 要知道,除非使用“ORDER BY”,否则SQL server并不总是返回相同的记录。换句话说,如果一条记录由于发生更新而无法读取,而数据库服务器可以读取下一条记录,它将尽快获取下一条记录以给出结果。我不确定这个限制是否会迫使数据库服务器考虑某种顺序,我对MySql不太熟悉 假设有1/3的访客会观看所有1000个id,而2/3的访客只会观看前50个id 因为你想优化你的回应,因为你假设访问者会如何对待它 对于性能/工作负载来说,一个查询可以查询所有1000个id,还是将它们分成20个查询,每个查询50个id?因此,当前50个被观看时,查询下一个50个,以此类推 是的,您是对的,您应该限制返回响应。 这是一个如何实现您的需求的示例,我对mysql知之甚少,但这就是如何获得期望的结果
SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....)
order by `id`
LIMIT 10 OFFSET 10
如果是SQL SERVER:
上面的查询将做的是:它将获得所发布id的所有数据,然后它将按id升序排序。然后从他们那里,it将只选择前10/50/100,下一次,it将选择下一个10/50/100或任何您选择的“选择”和“跳过”选项。希望这能帮上忙:不,我不需要订购,我知道挂载/限制等。但什么是更好的工作量?我不知道sql是如何处理查询、缓存等的。我不知道MySQL是如何处理缓存的。我知道使用SQL Server时,最好提供带有参数的查询,ORM通常会这样做。这样SQLServer就可以重用它生成的查询执行计划。如果参数位于查询本身内部,则每个查询在缓存中的外观将不同,因此将单独存储。但通常情况下,由于性能通常不是很线性,我会说测试它。尤其是当您尝试比较检索的数据要少得多,而发送到数据库服务器的查询要少得多时。如果您没有显示所有这些数据,则无需选择它们,只需显示分页的总行数。是的,但如上所述,有1/3的用户将查看所有数据,最多会有1000个id,所以可能有一半的时间少于100I来自mssql背景,而不是mysql背景,但如果我在mssql中这样做,我将以两种方式编写它,并使用执行计划和运行SQLServerProfiler的结果检查性能,以了解这两种方法的区别。虽然运行更多的查询可能比运行更大的查询需要更多的时间,但您可能会发现,对于2/3的情况,它会更快,而且,根据查询的执行方式,它可能会使应用程序更具响应性。此外,不确定这是否是mysql中的内容,但是,编写一个存储过程并传入一个用户定义的表类型参数可能是值得的。这可能会获得一些性能,因为您将有一个预先确定的执行计划。这至少在mssql世界中是可能的,但对mysql不确定。仅回答编辑1000 ID一点也不重要。我宁愿做一个查询来获得1000,而不是处理20个不同的查询。当然,它们对于网格来说太多了。若并没有在itif上应用分页,那个么若你们在接口上处理分页,那个么它就可以了。如果没有,您可以像我刚才告诉您的那样从SQL处理。对于网格?你的意思是如何显示它们??这是另一个主题,问题是是否仅限于服务器性能/工作负载使用中的语法获取1000个ID是可以的,但是如果您希望它在性能上更快,那么以上就是您可以管理它的方法之一。天啊,好吧,那我就选D
create stored proc sp_SomeName
@id varchar(8000)
@skip int,
@take int
as
begin
SELECT * FROM some_table WHERE id IN (23221, 42422, 2342342....)
order by id
OFFSET @skip ROWS --if 0 then start selecting from 0
FETCH NEXT @take ROWS ONLY --if 10 then this is the max returning limit
end