Проблема с производительностью SQL
-
Здравствуйте!
На проектах с относительно большой БД наблюдаются проблемы с производительностью следующего запроса:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'ytrssenabled_meta_value' ) LEFT JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (1,4,16,178,591,1113,1465) ) AND ( wp_postmeta.post_id IS NULL OR ( mt1.meta_key = 'ytrssenabled_meta_value' AND mt1.meta_value != 'yes' ) ) AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 40
План запроса:
+----+-------------+-----------------------+------------+--------+---------------------------------------------------------------------------------------+---------+---------+-----------------------------------------------+-------+----------+-----------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------------------+------------+--------+---------------------------------------------------------------------------------------+---------+---------+-----------------------------------------------+-------+----------+-----------------------------------------------------------+ | 1 | SIMPLE | wp_term_relationships | NULL | index | PRIMARY,term_taxonomy_id | PRIMARY | 16 | NULL | 57546 | 34.27 | Using where; Using index; Using temporary; Using filesort | | 1 | SIMPLE | wp_posts | NULL | eq_ref | PRIMARY,type_status_date,type_status_modified_gmt,status_type_password1_date_modified | PRIMARY | 8 | project.wp_term_relationships.object_id | 1 | 17.22 | Using where | | 1 | SIMPLE | wp_postmeta | NULL | ref | post_id,meta_key | post_id | 8 | project.wp_term_relationships.object_id | 232 | 100.00 | Using where | | 1 | SIMPLE | mt1 | NULL | ref | post_id | post_id | 8 | project.wp_term_relationships.object_id | 232 | 100.00 | Using where | +----+-------------+-----------------------+------------+--------+---------------------------------------------------------------------------------------+---------+---------+-----------------------------------------------+-------+----------+-----------------------------------------------------------+ 4 rows in set, 1 warning (0.13 sec)
В проекте следующий объем данных по таблицам WP:
- wp_postmeta – 25 млн записей
- wp_posts – 150 тыс записей
- wp_term_relationships – 58 тыс записей
Профилирование запроса:
mysql> SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=2; +----------+-----+--------------------------------+------------+------------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+---------------------------+----------------------+-------------+ | QUERY_ID | SEQ | STATE | DURATION | CPU_USER | CPU_SYSTEM | CONTEXT_VOLUNTARY | CONTEXT_INVOLUNTARY | BLOCK_OPS_IN | BLOCK_OPS_OUT | MESSAGES_SENT | MESSAGES_RECEIVED | PAGE_FAULTS_MAJOR | PAGE_FAULTS_MINOR | SWAPS | SOURCE_FUNCTION | SOURCE_FILE | SOURCE_LINE | +----------+-----+--------------------------------+------------+------------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+---------------------------+----------------------+-------------+ | 2 | 2 | starting | 0.000019 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NULL | NULL | NULL | | 2 | 3 | Waiting for query cache lock | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | try_lock | sql_cache.cc | 509 | | 2 | 4 | starting | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | try_lock | sql_cache.cc | 509 | | 2 | 5 | checking query cache for query | 0.000120 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | send_result_to_client | sql_cache.cc | 1655 | | 2 | 6 | checking permissions | 0.000005 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | check_access | sql_authorization.cc | 809 | | 2 | 7 | checking permissions | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | check_access | sql_authorization.cc | 809 | | 2 | 8 | checking permissions | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | check_access | sql_authorization.cc | 809 | | 2 | 9 | checking permissions | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | check_access | sql_authorization.cc | 809 | | 2 | 10 | Opening tables | 0.000028 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | open_tables | sql_base.cc | 5793 | | 2 | 11 | init | 0.000052 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | handle_query | sql_select.cc | 128 | | 2 | 12 | System lock | 0.000013 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | mysql_lock_tables | lock.cc | 330 | | 2 | 13 | Waiting for query cache lock | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | try_lock | sql_cache.cc | 509 | | 2 | 14 | System lock | 0.000022 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | try_lock | sql_cache.cc | 509 | | 2 | 15 | optimizing | 0.000027 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | optimize | sql_optimizer.cc | 158 | | 2 | 16 | statistics | 0.001341 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | optimize | sql_optimizer.cc | 374 | | 2 | 17 | preparing | 0.000031 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | optimize | sql_optimizer.cc | 482 | | 2 | 18 | Creating tmp table | 0.000043 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | create_intermediate_table | sql_executor.cc | 223 | | 2 | 19 | Sorting result | 0.000007 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | make_tmp_tables_info | sql_select.cc | 3849 | | 2 | 20 | executing | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | exec | sql_executor.cc | 126 | | 2 | 21 | Sending data | 158.098420 | 173.576000 | 101.552000 | 26545 | 6927 | 560 | 66448 | 0 | 0 | 0 | 2 | 0 | exec | sql_executor.cc | 202 | | 2 | 22 | Creating sort index | 0.003703 | 0.012000 | 0.000000 | 1 | 1 | 0 | 736 | 0 | 0 | 0 | 0 | 0 | sort_table | sql_executor.cc | 2621 | | 2 | 23 | end | 0.000008 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | handle_query | sql_select.cc | 206 | | 2 | 24 | query end | 0.000007 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | mysql_execute_command | sql_parse.cc | 4956 | | 2 | 25 | removing tmp table | 0.000010 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | free_tmp_table | sql_tmp_table.cc | 2413 | | 2 | 26 | query end | 0.000005 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | free_tmp_table | sql_tmp_table.cc | 2442 | | 2 | 27 | closing tables | 0.000014 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | mysql_execute_command | sql_parse.cc | 5009 | | 2 | 28 | freeing items | 0.000029 | 0.000000 | 0.000000 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | mysql_parse | sql_parse.cc | 5622 | | 2 | 29 | logging slow query | 0.000050 | 0.000000 | 0.000000 | 0 | 0 | 0 | 16 | 0 | 0 | 0 | 0 | 0 | log_slow_do | log.cc | 1716 | | 2 | 30 | cleaning up | 0.000034 | 0.000000 | 0.000000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | dispatch_command | sql_parse.cc | 1931 | +----------+-----+--------------------------------+------------+------------+------------+-------------------+---------------------+--------------+---------------+---------------+-------------------+-------------------+-------------------+-------+---------------------------+----------------------+-------------+ 29 rows in set, 1 warning (0.00 sec)
Знаю как минимум ещё один большой проект, где подобную проблему обошли форком плагина с последующей доработкой.
Аналогичная проблема может наблюдаться в плагине Яндекс.Дзен.
Viewing 5 replies - 1 through 5 (of 5 total)
Viewing 5 replies - 1 through 5 (of 5 total)
- The topic ‘Проблема с производительностью SQL’ is closed to new replies.