Project

General

Profile

Bug #86952 » speed_up_backend_flushByTags.diff

Jörg Velletti, 2018-11-20 10:45

View differences:

vendor/typo3/cms/typo3/sysext/core/Classes/Cache/Backend/Typo3DatabaseBackend.php (date 1542704751280)
array_walk(array_chunk($tags, 100), [$this, 'flushByTags']);
return;
}
// VERY simple quoting of tags is sufficient here for performance. Tags are already
// validated to not contain any bad characters, e.g. they are automatically generated
// inside this class and suffixed with a pure integer enforced by DB.
$quotedTagList = array_map(function ($value) {
return '\'' . $value . '\'';
}, $tags);
if ($this->isConnectionMysql($connection)) {
// Use a optimized query on mysql ... don't use on your own
// * ansi sql does not know about multi table delete
// * doctrine query builder does not support join on delete()
$connection->executeQuery(
'DELETE tags2, cache1'
. ' FROM ' . $this->tagsTable . ' AS tags1'
. ' JOIN ' . $this->tagsTable . ' AS tags2 ON tags1.identifier = tags2.identifier'
. ' JOIN ' . $this->cacheTable . ' AS cache1 ON tags1.identifier = cache1.identifier'
. ' WHERE tags1.tag IN (' . implode(',', $quotedTagList) . ')'
);
// * 2018 : using just one query with an tags1.tag IN ( implode(',', $quotedTagList) . ')') was 3 times slower
foreach ($tags as $tag ) {
$quotedTag = '\'' . $tag . '\'';
$connection->executeQuery(
'DELETE tags2, cache1'
. ' FROM ' . $this->tagsTable . ' AS tags1'
. ' JOIN ' . $this->tagsTable . ' AS tags2 ON tags1.identifier = tags2.identifier'
. ' JOIN ' . $this->cacheTable . ' AS cache1 ON tags1.identifier = cache1.identifier'
. ' WHERE tags1.tag = ' . $quotedTag
);
}
} else {
// VERY simple quoting of tags is sufficient here for performance. Tags are already
// validated to not contain any bad characters, e.g. they are automatically generated
// inside this class and suffixed with a pure integer enforced by DB.
$quotedTagList = array_map(function ($value) {
return '\'' . $value . '\'';
}, $tags);
$queryBuilder = $connection->createQueryBuilder();
$result = $queryBuilder->select('identifier')
->from($this->tagsTable)
    (1-1/1)