如果我们要传递一个大列表,那么在mysql中获取行数的最佳实践
我想获得具有sec_id的行数,ref_id应该出现在列表中,比如说如果我们要传递一个大列表,那么在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为查询中的所有条件创建特定索引 就你而言:
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 (?,?,...,?)