Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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中获取行数的最佳实践_Mysql_Sql_Hibernate_Jpa - Fatal编程技术网

如果我们要传递一个大列表,那么在mysql中获取行数的最佳实践

如果我们要传递一个大列表,那么在mysql中获取行数的最佳实践,mysql,sql,hibernate,jpa,Mysql,Sql,Hibernate,Jpa,我想获得具有sec_id的行数,ref_id应该出现在列表中,比如说ref_list。 参考列表的大小约为300。 桌子的大小约为70000张 我目前正在使用此技术获取满足上述条件的行数 从sec_id=?以及(?,,…,?)中的参考id 它需要20到30毫秒才能执行 但是这个查询将执行1200多次,所以执行的总时间大约是45到50秒 是否有其他方法可以修改上述查询,以缩短时间 该表以id作为主键和 ref_id键类型为多个 数据库->MySQL为查询中的所有条件创建特定索引 就你而言:

我想获得具有sec_id的行数,ref_id应该出现在列表中,比如说
ref_list
。 参考列表的大小约为300。 桌子的大小约为70000张

我目前正在使用此技术获取满足上述条件的行数

从sec_id=?以及(?,,…,?)中的参考id
它需要20到30毫秒才能执行

但是这个查询将执行1200多次,所以执行的总时间大约是45到50秒

是否有其他方法可以修改上述查询,以缩短时间

该表以
id
作为
主键
ref_id
键类型为多个


数据库->MySQL

为查询中的所有条件创建特定索引

就你而言:

    create index your_index_name on table (sec_id, ref_id);
尽量避免在where条件中添加函数。函数不能使用索引


也考虑使用MySQL查询缓存,如果你的一些递归请求是相等的。

< P>不要运行多个查询。使用
sec\u id
/
ref\u id
的所有值创建一个临时表,然后运行单个聚合查询。假设您希望每个
秒id
有一行,那么:

select t.sec_id, count(t.sec_id)
from sec_ref sr left join
     t
     on t.sec_id = sr.sec_id and t.ref_id = sr.ref_id
group by t.sec_id;

这将持续20-30毫秒以上。但是您只需要调用一次。

我同意Pau Seglar的观点:在sec_id,ref_id colums上创建索引是您的方式。顺便说一下:您可以在两个选项中进行选择:

  • 创建两个简单索引-一个在colunm secuu id上,另一个在 参考id
  • 在sec_id、ref_id上创建一个复合索引
这两种选择都适合你。但是,对于这个查询,复合索引可能会更快一些。复合索引的一个缺点是,它对于以下请求非常合适:

SELECT count(*) FROM table where sec_id=? and ref_id IN (?,?,...,?)

它将不会被用于

SELECT count(*) FROM table where ref_id IN (?,?,...,?)

(如果索引中的First colunt未在WHERE中使用)

请说明表中是否有索引请查看更新的问题@SergeyCreate index by
(sec\u id,ref\u id)
是否只能在查询级别执行任何操作?还是必须更改模式并创建新的索引@如果您的值列表包含约300个值,则服务器已将其作为表数据进行排序(索引)。查询级别无需改进。太好了,谢谢!!!,总执行时间现在减少到最多1-2秒(在1200+次迭代之后)。顺便问一下,如果我不想计数并且每
sec\u id获得2-3行,我该怎么办。您只需删除
count(*)
groupby
并选择所需的列即可。谢谢,这将查询执行时间从20ms减少到1ms,但gordon的回答使总执行时间显著减少。感谢您提供的宝贵帮助
SELECT count(*) FROM table where ref_id IN (?,?,...,?)