• net

    (@krstarica)


    When saving any post, the plugin “clears” the cache which takes almost 3 seconds!

    Here is the slow query:

    UPDATE wp_wrc_caches
    	SET expiration = '1970-01-01 00:00:01'
    	WHERE cache_type = 'endpoint' 
    	AND object_type = 'post'
    	AND is_single = 0;

    Table wp_wrc_caches contains 70k records. Query above examines 3.3k records.

    • This topic was modified 1 year, 9 months ago by net.
Viewing 12 replies - 1 through 12 (of 12 total)
  • Plugin Author Richard Korthuis

    (@rockfire)

    Hi @krstarica

    Thank you for using our plugin!

    I am sorry to hear you are having performance issues. In order for us to investigate this properly could you provide us with a SQL-dump of the wp_wrc_caches table? You may email it to plugins at acato dot nl

    Thread Starter net

    (@krstarica)

    Many thanks @rockfire for the prompt reply.

    I’ve just sent SQL dump to email address provided.

    Plugin Author Richard Korthuis

    (@rockfire)

    Hi @krstarica

    I have received your SQL dump and have imported it in my local testing environment. If I run the UPDATE query on your table it runs in 0.125 seconds, so way quicker than your 3 seconds. I even did some test with updating all the records so the query would have to do a lot more updates, but still it ran in less than 0.2 seconds. Which to me is very acceptable. I also did an EXPLAIN on the UPDATE query and it tells me it is using the most optimal index, so nothing to gain there either.
    It seems to me that something on your server is causing this issue, this could either be your MySQL server is slow (but I wouldn’t expect you to complain here if all your queries were slow), or it could be something has messed up your MySQL indexes, maybe you could try recreating them?

    Thread Starter net

    (@krstarica)

    After OPTIMIZE TABLE wp_wrc_caches, it’s still the same.

    Maybe this issue is specific to MariaDB 10.6?

    Plugin Author Richard Korthuis

    (@rockfire)

    Hi @krstarica

    Sorry to hear the OPTIMIZE did not help. Could you run the UPDATE query with an EXPLAIN?

    EXPLAIN UPDATE wp_wrc_caches
    	SET expiration = '1970-01-01 00:00:01'
    	WHERE cache_type = 'endpoint' 
    	AND object_type = 'post'
    	AND is_single = 0;

    Maybe somehow your indexes aren’t working correctly.

    I will try to investigate the issue with MariaDB 10.6, this will however take some time, since because of the holiday season we do not have much spare time for these kind of issues.

    Thread Starter net

    (@krstarica)

    +------+-------------+---------------+-------------+------------------------------+------------------------------+---------+------+------+------------------------------------------------------------+
    | id   | select_type | table         | type        | possible_keys                | key                          | key_len | ref  | rows | Extra                                                      |
    +------+-------------+---------------+-------------+------------------------------+------------------------------+---------+------+------+------------------------------------------------------------+
    |    1 | SIMPLE      | wp_wrc_caches | index_merge | cache_type,non_single_caches | cache_type,non_single_caches | 42,809  | NULL | 3971 | Using intersect(cache_type,non_single_caches); Using where |
    +------+-------------+---------------+-------------+------------------------------+------------------------------+---------+------+------+------------------------------------------------------------+
    Thread Starter net

    (@krstarica)

    ANALYZE provides better insights than EXPLAIN.

    See the difference in speed and different index used below.

    With FORCE INDEX(non_single_caches) update is much faster.

    So the problem is in index intersection.

    ANALYZE SELECT * FROM wp_wrc_caches WHERE cache_type='endpoint' AND object_type='post' AND is_single=0;
    +------+-------------+---------------+------+------------------------------+-------------------+---------+-------------------+-------+---------+----------+------------+-----------------------+
    | id   | select_type | table         | type | possible_keys                | key               | key_len | ref               | rows  | r_rows  | filtered | r_filtered | Extra                 |
    +------+-------------+---------------+------+------------------------------+-------------------+---------+-------------------+-------+---------+----------+------------+-----------------------+
    |    1 | SIMPLE      | wp_wrc_caches | ref  | cache_type,non_single_caches | non_single_caches | 809     | const,const,const | 11898 | 5950.00 |   100.00 |     100.00 | Using index condition |
    +------+-------------+---------------+------+------------------------------+-------------------+---------+-------------------+-------+---------+----------+------------+-----------------------+
    1 row in set (0.034 sec)
    ANALYZE UPDATE wp_wrc_caches SET expiration='1970-01-01 00:00:01' WHERE cache_type='endpoint' AND object_type='post' AND is_single=0;
    +------+-------------+---------------+-------------+------------------------------+------------------------------+---------+------+-------+---------+----------+------------+------------------------------------------------------------+
    | id   | select_type | table         | type        | possible_keys                | key                          | key_len | ref  | rows  | r_rows  | filtered | r_filtered | Extra                                                      |
    +------+-------------+---------------+-------------+------------------------------+------------------------------+---------+------+-------+---------+----------+------------+------------------------------------------------------------+
    |    1 | SIMPLE      | wp_wrc_caches | index_merge | cache_type,non_single_caches | cache_type,non_single_caches | 42,809  | NULL | 11898 | 5950.00 |   100.00 |     100.00 | Using intersect(cache_type,non_single_caches); Using where |
    +------+-------------+---------------+-------------+------------------------------+------------------------------+---------+------+-------+---------+----------+------------+------------------------------------------------------------+
    1 row in set (3.128 sec)
    ANALYZE UPDATE wp_wrc_caches IGNORE INDEX(cache_type) SET expiration='1970-01-01 00:00:01' WHERE cache_type='endpoint' AND object_type='post' AND is_single=0;
    +------+-------------+---------------+-------+-------------------+-------------------+---------+------+-------+---------+----------+------------+-------------+
    | id   | select_type | table         | type  | possible_keys     | key               | key_len | ref  | rows  | r_rows  | filtered | r_filtered | Extra       |
    +------+-------------+---------------+-------+-------------------+-------------------+---------+------+-------+---------+----------+------------+-------------+
    |    1 | SIMPLE      | wp_wrc_caches | range | non_single_caches | non_single_caches | 809     | NULL | 12524 | 5951.00 |   100.00 |     100.00 | Using where |
    +------+-------------+---------------+-------+-------------------+-------------------+---------+------+-------+---------+----------+------------+-------------+
    1 row in set (0.192 sec)
    ANALYZE UPDATE wp_wrc_caches IGNORE INDEX(non_single_caches) SET expiration='1970-01-01 00:00:01' WHERE cache_type='endpoint' AND object_type='post' AND is_single=0;
    +------+-------------+---------------+-------+---------------+---------+---------+------+--------+-----------+----------+------------+-------------+
    | id   | select_type | table         | type  | possible_keys | key     | key_len | ref  | rows   | r_rows    | filtered | r_filtered | Extra       |
    +------+-------------+---------------+-------+---------------+---------+---------+------+--------+-----------+----------+------------+-------------+
    |    1 | SIMPLE      | wp_wrc_caches | index | cache_type    | PRIMARY | 8       | NULL | 120710 | 121915.00 |   100.00 |       4.88 | Using where |
    +------+-------------+---------------+-------+---------------+---------+---------+------+--------+-----------+----------+------------+-------------+
    1 row in set (0.270 sec)
    ANALYZE UPDATE wp_wrc_caches FORCE INDEX(non_single_caches) SET expiration='1970-01-01 00:00:01' WHERE cache_type='endpoint' AND object_type='post' AND is_single=0;
    +------+-------------+---------------+-------+-------------------+-------------------+---------+------+-------+---------+----------+------------+-------------+
    | id   | select_type | table         | type  | possible_keys     | key               | key_len | ref  | rows  | r_rows  | filtered | r_filtered | Extra       |
    +------+-------------+---------------+-------+-------------------+-------------------+---------+------+-------+---------+----------+------------+-------------+
    |    1 | SIMPLE      | wp_wrc_caches | range | non_single_caches | non_single_caches | 809     | NULL | 11898 | 5950.00 |   100.00 |     100.00 | Using where |
    +------+-------------+---------------+-------+-------------------+-------------------+---------+------+-------+---------+----------+------------+-------------+
    1 row in set (0.197 sec)
    • This reply was modified 1 year, 6 months ago by net.
    • This reply was modified 1 year, 6 months ago by net.
    Plugin Author Richard Korthuis

    (@rockfire)

    Hi @krstarica

    Thank you for your thorough investigation of the issue. We will look into it and see if we can improve the queries by using the FORCE INDEX. I will get back to you!

    Thread Starter net

    (@krstarica)

    The workaround is to replace the following code in function delete_object_type_caches in file wp-content/plugins/wp-rest-cache/includes/caching/class-caching.php:

    $sql =
    	"UPDATE `{$this->db_table_caches}`
    		SET {$set_clause}
            WHERE `cache_type` = %s 
            AND `object_type` = %s
            AND `is_single` = %d";

    with:

    $sql =
    	"UPDATE `{$this->db_table_caches}` FORCE INDEX(`non_single_caches`)
    		SET {$set_clause}
            WHERE `cache_type` = %s 
            AND `object_type` = %s
            AND `is_single` = %d";

    This issue is somewhat related to idea to get rid of database queries altogether by using the file system:
    https://wordpress.org/support/topic/serving-static-json-files/

    Plugin Author Richard Korthuis

    (@rockfire)

    Hi @krstarica

    Thank you for your workaround, we did find that ourselves. But if this single query can be improved so much with this change, we first want to investigate all queries and see if they can benefit from a similar change and do all those changes at once (and test them). So that is why we don’t immediately release this simple fix. But we will fix it, just as soon as we have investigated all queries made by our plugin.

    Thread Starter net

    (@krstarica)

    Actually, don’t really think that using force index is the solution.

    The real question is why do we need it in the first place. For some reason MariaDB optimizer does not use the right index.

    Probably removing cache_type index would help, but I guess that one is used for some other query?

    Thread Starter net

    (@krstarica)

    Still experiencing the same issue with version 2023.1.1

Viewing 12 replies - 1 through 12 (of 12 total)
  • The topic ‘Serious performance issue’ is closed to new replies.