【发布时间】:2016-06-04 19:46:00
【问题描述】:
我有 10 个大型只读表。我做了很多格式相同但参数不同的查询,例如:
SELECT 'count' FROM table1 WHERE x='SOME VARIABLE';
SELECT 'count' FROM table1 WHERE x='SOME OTHER VARIABLE';
...
SELECT 'count' FROM table2 WHERE x='' AND y='';
SELECT 'count' FROM table2 WHERE x='' AND y='';
...
SELECT 'count' FROM table3 WHERE x='' AND y='' AND z='';
每个查询使用的变量都不同,所以我几乎从不两次执行相同的查询。 MySQL端的查询缓存和行缓存会浪费并且应该禁用它们是否正确?表缓存似乎是一件好事。
在客户端,我使用的是我认为很好的准备好的语句。如果我启用 Prepared 语句缓存(通过 Slick),但由于参数如此多变,这不会影响我的性能吗?我还能做些什么来优化我的表现吗?
是否应该关闭自动提交,因为我只进行选择并且永远不需要回滚?
【问题讨论】:
-
为什么不首先关注您的主要访问途径并确认您的索引策略是否平衡。在 upsert 的缓慢与读取的速度之间取得了很好的平衡。顺便说一句,准备好的语句通常不被认为是一种性能提升机制,就像它们用于 1) 可读性 2) 注入安全性 3) 类型安全性一样。我会冒险猜测 95% 的准备好的语句没有被重用
-
对于准备好的语句绑定的速度,它们很慢。我为什么这么说?由于测试。通过不使用准备好的语句,使用其他策略尤其是处理大型集合可以快 50 倍以上。
-
我不知道,我想我混淆了 p.s.使用准备好的语句进行缓存。谢谢你。我的指数策略是可靠的。我正在考虑压缩/打包我的表并将 var-char 列转换为性能更高的类型。
-
您打算使用哪个引擎?表的大小是多少(我们是在谈论数百个条目,还是这些数千/数百万个条目)?条件属性
x,y,z是否分别包含每个表的主键? -
只是不要试图过度设计某些东西并解决你没有的问题。对我来说,数据摄取率至关重要,所以我别无选择。对于 onsy-twosy 行(插入),我会忽略我的胡言乱语。
标签: mysql database caching jdbc slick