Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询性能中的SQL-最好将其拆分或不拆分_Mysql_Sql_Performance - Fatal编程技术网

Mysql 查询性能中的SQL-最好将其拆分或不拆分

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

我从另一台服务器获取多达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个被观看时,查询下一个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