]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Use two indexes instead of one for hashed urls
authorJeremy Benoist <jeremy.benoist@gmail.com>
Wed, 5 Jun 2019 08:51:06 +0000 (10:51 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Wed, 5 Jun 2019 08:53:15 +0000 (10:53 +0200)
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.

app/DoctrineMigrations/Version20190601125843.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php

index 341d64dc2933cdd09b3bcc8f9bea37851f5a61b1..0e97606e9f9ca882079fd19cf28e2bf99c8480bf 100644 (file)
@@ -30,27 +30,8 @@ class Version20190601125843 extends WallabagMigration
             ]);
         }
 
-        $entryTable->dropIndex('hashed_url_user_id');
-        $entryTable->addIndex(
-            [
-                'user_id',
-                'hashed_url',
-                'hashed_given_url',
-            ],
-            'hashed_urls_user_id',
-            [],
-            [
-                // specify length for index which is required by MySQL on text field
-                'lengths' => [
-                    // user_id
-                    null,
-                    // hashed_url
-                    40,
-                    // hashed_given_url
-                    40,
-                ],
-            ]
-        );
+        // 40 = length of sha1 field hashed_given_url
+        $entryTable->addIndex(['user_id', 'hashed_given_url'], 'hashed_given_url_user_id', [], ['lengths' => [null, 40]]);
     }
 
     /**
@@ -68,7 +49,6 @@ class Version20190601125843 extends WallabagMigration
             $entryTable->dropColumn('hashed_given_url');
         }
 
-        $entryTable->dropIndex('hashed_urls_user_id');
-        $entryTable->addIndex(['user_id', 'hashed_url'], 'hashed_url_user_id', [], ['lengths' => [null, 40]]);
+        $entryTable->dropIndex('hashed_given_url_user_id');
     }
 }
index 304dd1b3bbe06413cbe9f550c16c43d14633cd33..19f81c0f4454dc0e93349078b2eaafa387186ec6 100644 (file)
@@ -27,7 +27,8 @@ use Wallabag\UserBundle\Entity\User;
  *     indexes={
  *         @ORM\Index(name="created_at", columns={"created_at"}),
  *         @ORM\Index(name="uid", columns={"uid"}),
- *         @ORM\Index(name="hashed_urls_user_id", columns={"user_id", "hashed_url", "hashed_given_url"}, options={"lengths"={null, 40, 40}})
+ *         @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"}, options={"lengths"={null, 40}}),
+ *         @ORM\Index(name="hashed_given_url_user_id", columns={"user_id", "hashed_given_url"}, options={"lengths"={null, 40}})
  *     }
  * )
  * @ORM\HasLifecycleCallbacks()
index 8b29aad2d2e81823239ac98e9c91454cc8802c56..7772e0b78a7c29387278ddcfd138a003187d408e 100644 (file)
@@ -366,9 +366,20 @@ class EntryRepository extends EntityRepository
      */
     public function findByHashedUrlAndUserId($hashedUrl, $userId)
     {
+        // try first using hashed_url (to use the database index)
         $res = $this->createQueryBuilder('e')
             ->where('e.hashedUrl = :hashed_url')->setParameter('hashed_url', $hashedUrl)
-            ->orWhere('e.hashedGivenUrl = :hashed_given_url')->setParameter('hashed_given_url', $hashedUrl)
+            ->andWhere('e.user = :user_id')->setParameter('user_id', $userId)
+            ->getQuery()
+            ->getResult();
+
+        if (\count($res)) {
+            return current($res);
+        }
+
+        // then try using hashed_given_url (to use the database index)
+        $res = $this->createQueryBuilder('e')
+            ->where('e.hashedGivenUrl = :hashed_given_url')->setParameter('hashed_given_url', $hashedUrl)
             ->andWhere('e.user = :user_id')->setParameter('user_id', $userId)
             ->getQuery()
             ->getResult();
index a6fd3fff7bd4939e2dd214501f52f808bf83a39b..e9c12c49c9f87a53d5783a9585b043fb44d54a39 100644 (file)
@@ -265,6 +265,9 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
     }
 
+    /**
+     * This test will require an internet connection.
+     */
     public function testPostNewOkUrlExistWithRedirection()
     {
         $this->logInAs('admin');