diff options
author | Jeremy Benoist <jeremy.benoist@gmail.com> | 2019-06-05 10:51:06 +0200 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2019-06-05 10:53:15 +0200 |
commit | 70df4c335965a9562cc24d3ccea0a6ed1a23b7b1 (patch) | |
tree | a0c398645e5d340940cf25fab9cab46eb7903e86 /src | |
parent | f3bfb875e94021a93e24a41fbc0f8d86d4dee378 (diff) | |
download | wallabag-70df4c335965a9562cc24d3ccea0a6ed1a23b7b1.tar.gz wallabag-70df4c335965a9562cc24d3ccea0a6ed1a23b7b1.tar.zst wallabag-70df4c335965a9562cc24d3ccea0a6ed1a23b7b1.zip |
Use two indexes instead of one for hashed urls
When using `OR` in a where clause, a composite index can't be used. We should use a `UNION` to take advantages of it.
Instead, create 2 indexes on each hashed urls and make 2 queries to find an url. It'll be faster than the previous solution.
Diffstat (limited to 'src')
-rw-r--r-- | src/Wallabag/CoreBundle/Entity/Entry.php | 3 | ||||
-rw-r--r-- | src/Wallabag/CoreBundle/Repository/EntryRepository.php | 13 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 304dd1b3..19f81c0f 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php | |||
@@ -27,7 +27,8 @@ use Wallabag\UserBundle\Entity\User; | |||
27 | * indexes={ | 27 | * indexes={ |
28 | * @ORM\Index(name="created_at", columns={"created_at"}), | 28 | * @ORM\Index(name="created_at", columns={"created_at"}), |
29 | * @ORM\Index(name="uid", columns={"uid"}), | 29 | * @ORM\Index(name="uid", columns={"uid"}), |
30 | * @ORM\Index(name="hashed_urls_user_id", columns={"user_id", "hashed_url", "hashed_given_url"}, options={"lengths"={null, 40, 40}}) | 30 | * @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"}, options={"lengths"={null, 40}}), |
31 | * @ORM\Index(name="hashed_given_url_user_id", columns={"user_id", "hashed_given_url"}, options={"lengths"={null, 40}}) | ||
31 | * } | 32 | * } |
32 | * ) | 33 | * ) |
33 | * @ORM\HasLifecycleCallbacks() | 34 | * @ORM\HasLifecycleCallbacks() |
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 8b29aad2..7772e0b7 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php | |||
@@ -366,9 +366,20 @@ class EntryRepository extends EntityRepository | |||
366 | */ | 366 | */ |
367 | public function findByHashedUrlAndUserId($hashedUrl, $userId) | 367 | public function findByHashedUrlAndUserId($hashedUrl, $userId) |
368 | { | 368 | { |
369 | // try first using hashed_url (to use the database index) | ||
369 | $res = $this->createQueryBuilder('e') | 370 | $res = $this->createQueryBuilder('e') |
370 | ->where('e.hashedUrl = :hashed_url')->setParameter('hashed_url', $hashedUrl) | 371 | ->where('e.hashedUrl = :hashed_url')->setParameter('hashed_url', $hashedUrl) |
371 | ->orWhere('e.hashedGivenUrl = :hashed_given_url')->setParameter('hashed_given_url', $hashedUrl) | 372 | ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) |
373 | ->getQuery() | ||
374 | ->getResult(); | ||
375 | |||
376 | if (\count($res)) { | ||
377 | return current($res); | ||
378 | } | ||
379 | |||
380 | // then try using hashed_given_url (to use the database index) | ||
381 | $res = $this->createQueryBuilder('e') | ||
382 | ->where('e.hashedGivenUrl = :hashed_given_url')->setParameter('hashed_given_url', $hashedUrl) | ||
372 | ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) | 383 | ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) |
373 | ->getQuery() | 384 | ->getQuery() |
374 | ->getResult(); | 385 | ->getResult(); |