这是一个非常简单的问题.将数据插入表中通常可以正常工作,除了插入查询需要几秒钟的几次.(我并不想批量插入数据).所以我设置了插入过程的模拟,找出为什么插入查询偶尔会超过2秒运行.约书亚建议可以调整索引文件; 我删除了id(主键字段),但延迟仍然发生.
我有一个MyISAM表:( daniel_test_insert这个表开始完全为空):
create table if not exists daniel_test_insert (
id int unsigned auto_increment not null,
value_str varchar(255) not null default '',
value_int int unsigned default 0 not null,
primary key (id)
)
Run Code Online (Sandbox Code Playgroud)
我将数据插入其中,有时插入查询需要> 2秒才能运行. 此表上没有读取 - 只能通过单线程程序串行写入.
我运行完全相同的查询100,000次,以查找查询时间为何需要很长时间.到目前为止,它似乎是随机发生的.
例如,此查询花了4.194秒(插入的时间很长):
Query: INSERT INTO daniel_test_insert SET value_int=12345, value_str='afjdaldjsf aljsdfl ajsdfljadfjalsdj fajd as f' - ran for 4.194 seconds
status | duration | cpu_user | cpu_system | context_voluntary | context_involuntary | page_faults_minor
starting | 0.000042 …Run Code Online (Sandbox Code Playgroud) 我在heroku上有一个应用程序,在Puma上运行:
workers 2
threads_count 3
pool 5
Run Code Online (Sandbox Code Playgroud)
看起来有些请求卡在中间件中,它使应用程序非常慢(非常!).我见过其他人关于这个问题的线索,但到目前为止还没有解决方案.
如果您有任何提示,请告诉我.
!
!
与此问题相关
前提:
这些是我的假设,根据我的阅读,经验和理解,他们可能是错的,如果他们是,请评论,我会编辑问题.
题:
我有一个不在二级缓存中的对象.由于一些糟糕的编程或其他约束,加载对象的代码在同一个休眠会话中被多次调用.回顾是使用HQL查找查询,例如
hibernateTemplate.find("from Foo f where f.bar > ?", bar);
Run Code Online (Sandbox Code Playgroud)
在添加查询缓存之前,如果上述代码在同一个Hibernate会话中被调用了N次,那么数据库就会有N次命中
然后我想看看如果添加查询缓存会发生什么:
Query query = session.createQuery("from Foo f where f.bar > ?");
query.setCacheable(true);
query.setParameter(bar);
query.list();
Run Code Online (Sandbox Code Playgroud)
当我添加查询缓存时,我注意到在同一个会话期间,hibernate不会再次访问数据库N次,每个会话只有一次.
Foo不在第二级缓存中的object()在数据库中被更改,那么查询缓存(跨会话范围)将返回错误的标识符,从而返回错误的对象.那是对的吗?顺便说一下,在相关问题中声称查询缓存不适用于会话缓存范围.我想知道这个说法或其他什么吗?
我有新闻表及其相关的news_comment表.我已经使用news_comment表定义了关系newsComment.
如果我执行此查询:
$result = News::getDb()->cache(function () use($id) {
return News::find()->with('newsComment')->where(['news.id' => $id])->one();
});
Run Code Online (Sandbox Code Playgroud)
只缓存从新闻表中获取数据的查询.从相关表中选择的查询不是.
是否可以缓存执行的主查询和查询以从相关表中检索数据,而无需单独编写它们?
如果我在一个线程中多次调用一个查询,我只想为该线程缓存该查询(及其结果)(或者因为我每个线程使用一个会话,因为该会话),该怎么办?我这样做?
注意:我的第二级缓存已打开,但它主要用于session.get(...).但是我不想将它用于我的查询缓存,因为我只需要它在我的线程(/ session)期间存活.
谢谢
在NHibernate Profiler中,我观察到当我在关联上使用eager fetching时,在HQL Query中使用"left join fetch"或在Criteria Query中使用.SetFetchMode()时,查询不再缓存在查询缓存中.
事实上,从我所看到的只有非常基本的查询被缓存.如果有人能够让我深入了解哪些查询被缓存以及哪些查询没有,我将标记答案.
如果它有所不同,我正在使用Memcached ....对于查询密集系统,L2缓存是否有更好的选择?
我发现这很有挑战性 - 如果我不使用急切加载我有N + 1问题(但使用缓存),如果我急切加载,我从数据库中获取所有实体,但没有缓存.
似乎有相当厚的分界线,这两种策略都有性能改进,但这两种策略都会从其他策略中抢夺性能.
如果有人能够对这条"粗线"的位置有所了解,那么我应该保持最佳性能,或者如何"让线条变得更薄"......我会很满心并标记答案.
在Rails应用程序的统计信息部分,我有一些自定义SQL调用,使用模型代码中的ActiveRecord :: Base.execute()调用.他们返回各种聚合.
其中一些(相同的)查询在控制器的循环中运行,似乎它们不会被ActiveRecord查询缓存缓存.
有没有办法在单个请求中缓存自定义SQL查询?
我曾经在性能博客中读到,最好使用PHP的日期函数在MySQL查询中设置日期,而不是使用像curdate()这样的mysql日期函数,因为mysql可以缓存查询或结果或类似的东西.有没有人对此有任何见解?它有水还是无根据?
例:
$query = 'SELECT id FROM table WHERE publish_date = \''.date('Y-m-d').'\'';
Run Code Online (Sandbox Code Playgroud)
VS
$query = 'SELECT id FROM table WHERE publish_date = CURDATE()';
Run Code Online (Sandbox Code Playgroud) 我会尝试简单,所以我需要的是,执行MySQL查询(从表中选择记录)让我们说使用cron作业生成查询或者每隔5分钟生成一次查询,并将此查询或结果保存到文件或一个全局变量,如果可能的话,然后将它提供给所有客户端(即对所有用户使用相同的查询,而不必重新连接到该数据库.)现在我知道有些人会告诉我使用缓存,但我搜索了它,如果表更改将有新的缓存,我的表不断变化,现在我不在乎表是否已更改,我只想为所有客户端提供相同的查询.那可能吗?请你的建议.谢谢.
当表被修改(插入,更新,删除等)时,缓存会自动过期.我的表不断变化,即使表已被修改,也可以保存缓存吗?或者我应该寻找不同的解决方案?
我们正在升级到mysql 5.7,并发现它比它的5.6计数器部分慢得多.虽然两者具有几乎相同的配置,但5.6版本以毫秒为单位执行大部分sqls,而另一个对于中间复杂sql(例如下面的那个)大约需要1秒或更长时间.
-- Getting most recent users that are email-verified and not banned
SELECT
`u`.*
FROM
`user` AS `u`
INNER JOIN `user` user_table_alias ON user_table_alias.`id` = `u`.`id`
LEFT JOIN `user_suspend` user_suspend_table_alias ON user_suspend_table_alias.`userId` = `user_table_alias`.`id`
WHERE
(
`user_suspend_table_alias`.`id` IS NULL
)
AND
`user_table_alias`.`emailVerify` = 1
ORDER BY
`u`.`joinStamp` DESC
LIMIT 1, 18
Run Code Online (Sandbox Code Playgroud)
这两个表都很简单,索引很好:
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(128) NOT NULL …Run Code Online (Sandbox Code Playgroud) query-cache ×10
mysql ×4
php ×4
activerecord ×3
caching ×3
hibernate ×2
date ×1
heroku ×1
hql ×1
java ×1
nhibernate ×1
performance ×1
rack ×1
session ×1
sql ×1
sql-server ×1
yii2 ×1