查询很慢
Queries are very slow
我用 CMS Typo3 建立了一个网站。一切正常,但我有性能问题。前端生成速度非常慢。所以我决定安装扩展"T3Profiler"来分析问题。
我在探查器查询中发现:
SELECT content FROM cf_cache_hash WHERE identifier = 'f33c135b63eac6bb7194edab51f3c57a' AND cf_cache_hash.expires >= 1441015330 LIMIT 1
此类查询需要 90.000 - 600.000 毫秒。为什么这个选择这么慢?如何解决我的问题?
有人可以给我提示吗?
有时,当 sys_log
、*_cache_*
和其他系统表增长到巨大的规模时,会导致查询它们变得更慢、更慢……虽然它们经常在常见的渲染过程中被访问,但它们可以成为真正的性能杀手
有几种解决方法:
- 添加调度程序的任务以定期清理这些表,即
sys_log
并且可以在 ie 之后清除历史条目。 30 天,尤其是当系统处于开发状态并且 maaaany 每天都进行更改时。
- 检查表中填充的内容 - 即某些扩展程序可能会向
sys_log
添加数百个日志,即当某些方法未获得某些预期参数时 - 如果它在循环中使用并收集了数百个项目,则记录器有每个请求 (!) 写入错误数百次,修复代码以避免此类情况
- 通过安装工具确保所有表结构正确> 将当前数据库与规范进行比较
- 最后使用您的数据库 GUI 优化 and/or 修复 表。
除了@biesior 的回答之外,另一个技巧是将缓存存储在您的 TYPO3 数据库之外,因为数据选择已经使数据库承受了足够的压力。
对于 TYPO3 7.x 我在 AdditionalConfiguration.php
中是这样做的:
$redisCacheOptions = [
'hostname' => 'localhost',
'port' => 6379,
'database' => 2,
'password' => '******',
];
$cacheConfigurations = [
'cache_hash',
'cache_imagesizes',
'cache_pages',
'cache_pagesection',
'cache_rootline',
'extbase_datamapfactory_datamap',
'extbase_object',
'extbase_reflection',
'extbase_typo3dbbackend_queries',
'extbase_typo3dbbackend_tablecolumns'
];
foreach ($cacheConfigurations as $cacheConfiguration) {
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheConfiguration]['backend'] = \TYPO3\CMS\Core\Cache\Backend\RedisBackend::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheConfiguration]['options'] =
$redisCacheOptions + (array)$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheConfiguration]['options'];
}
我用 CMS Typo3 建立了一个网站。一切正常,但我有性能问题。前端生成速度非常慢。所以我决定安装扩展"T3Profiler"来分析问题。
我在探查器查询中发现:
SELECT content FROM cf_cache_hash WHERE identifier = 'f33c135b63eac6bb7194edab51f3c57a' AND cf_cache_hash.expires >= 1441015330 LIMIT 1
此类查询需要 90.000 - 600.000 毫秒。为什么这个选择这么慢?如何解决我的问题?
有人可以给我提示吗?
有时,当 sys_log
、*_cache_*
和其他系统表增长到巨大的规模时,会导致查询它们变得更慢、更慢……虽然它们经常在常见的渲染过程中被访问,但它们可以成为真正的性能杀手
有几种解决方法:
- 添加调度程序的任务以定期清理这些表,即
sys_log
并且可以在 ie 之后清除历史条目。 30 天,尤其是当系统处于开发状态并且 maaaany 每天都进行更改时。 - 检查表中填充的内容 - 即某些扩展程序可能会向
sys_log
添加数百个日志,即当某些方法未获得某些预期参数时 - 如果它在循环中使用并收集了数百个项目,则记录器有每个请求 (!) 写入错误数百次,修复代码以避免此类情况 - 通过安装工具确保所有表结构正确> 将当前数据库与规范进行比较
- 最后使用您的数据库 GUI 优化 and/or 修复 表。
除了@biesior 的回答之外,另一个技巧是将缓存存储在您的 TYPO3 数据库之外,因为数据选择已经使数据库承受了足够的压力。
对于 TYPO3 7.x 我在 AdditionalConfiguration.php
中是这样做的:
$redisCacheOptions = [
'hostname' => 'localhost',
'port' => 6379,
'database' => 2,
'password' => '******',
];
$cacheConfigurations = [
'cache_hash',
'cache_imagesizes',
'cache_pages',
'cache_pagesection',
'cache_rootline',
'extbase_datamapfactory_datamap',
'extbase_object',
'extbase_reflection',
'extbase_typo3dbbackend_queries',
'extbase_typo3dbbackend_tablecolumns'
];
foreach ($cacheConfigurations as $cacheConfiguration) {
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheConfiguration]['backend'] = \TYPO3\CMS\Core\Cache\Backend\RedisBackend::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheConfiguration]['options'] =
$redisCacheOptions + (array)$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheConfiguration]['options'];
}