Как оптимизировать приведенный ниже запрос и что это такое (Использование где; Использование буфера соединения (блочный вложенный L oop)) с помощью EXPLAIN - PullRequest
0 голосов
/ 31 марта 2020

У меня возникла проблема с запросом. всякий раз, когда я пытаюсь выбрать запрос, выполнение занимает от 10 до 15 секунд. и что есть (Использование где; Использование буфера соединения (блочный вложенный L oop)) в объяснении

Запрос:

SELECT  wp_posts.ID, post_title, post_content, wp_pvc_total.postcount,
        wp_pvc_total.postnum
    FROM  wp_posts
    LEFT JOIN  wp_term_relationships
          ON ( wp_posts.ID =
               wp_term_relationships.object_id )
    LEFT JOIN  wp_term_taxonomy
          ON ( wp_term_relationships.term_taxonomy_id =
               wp_term_taxonomy.term_taxonomy_id )
    LEFT JOIN  wp_pvc_total  ON ( wp_pvc_total.postnum = wp_posts.ID )
    WHERE  wp_posts.post_author = 630
      AND  wp_posts.post_author NOT IN(675)
      AND  wp_posts.ID != 48075
    GROUP BY  wp_posts.ID
    ORDER BY  wp_pvc_total.postcount DESC
    LIMIT  0, 9;

Запрос с объяснением

+----+-------------+-----------------------+--------+---------------------------------------------------------------------------+-------------+---------+-------------------------------------------------------+-------+--------------------------------------------------------+
| id | select_type | table                 | type   | possible_keys                                                             | key         | key_len | ref                                                   | rows  | Extra                                                  |
+----+-------------+-----------------------+--------+---------------------------------------------------------------------------+-------------+---------+-------------------------------------------------------+-------+--------------------------------------------------------+
|  1 | SIMPLE      | wp_posts              | range  | PRIMARY,post_name,type_status_date,post_parent,post_author,idx_post_title | post_author | 16      | NULL                                                  |  1682 | Using index condition; Using temporary; Using filesort |
|  1 | SIMPLE      | wp_term_relationships | ref    | PRIMARY                                                                   | PRIMARY     | 8       | marriai1_topic.wp_posts.ID                            |     1 | Using index                                            |
|  1 | SIMPLE      | wp_term_taxonomy      | eq_ref | PRIMARY                                                                   | PRIMARY     | 8       | marriai1_topic.wp_term_relationships.term_taxonomy_id |     1 | Using index                                            |
|  1 | SIMPLE      | wp_pvc_total          | ALL    | NULL                                                                      | NULL        | NULL    | NULL                                                  | 19670 | Using where; Using join buffer (Block Nested Loop)     |
+----+-------------+-----------------------+--------+---------------------------------------------------------------------------+-------------+---------+-------------------------------------------------------+-------+--------------------------------------------------------+

MySQL Версия 5.6, Innodb Engine и структуры таблиц:

CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content` longtext NOT NULL,
  `post_title` text NOT NULL,
  `post_excerpt` text NOT NULL,
  `post_status` varchar(20) NOT NULL DEFAULT 'publish',
  `comment_status` varchar(20) NOT NULL DEFAULT 'open',
  `ping_status` varchar(20) NOT NULL DEFAULT 'open',
  `post_password` varchar(255) NOT NULL DEFAULT '',
  `post_name` varchar(200) NOT NULL DEFAULT '',
  `to_ping` text NOT NULL,
  `pinged` text NOT NULL,
  `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content_filtered` longtext NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
  `guid` varchar(255) NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT '0',
  `post_type` varchar(20) NOT NULL DEFAULT 'post',
  `post_mime_type` varchar(100) NOT NULL DEFAULT '',
  `comment_count` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `post_name` (`post_name`(191)),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`),
  KEY `post_author` (`post_author`),
  FULLTEXT KEY `idx_post_title` (`post_title`)
)

и

CREATE TABLE `wp_pvc_total` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `postnum` varchar(255) NOT NULL,
  `postcount` int(11) NOT NULL DEFAULT '750',
  UNIQUE KEY `id` (`id`)
) 

1 Ответ

0 голосов
/ 01 апреля 2020

Добавить INDEX(postnum, postcount)

Это сделает достижение в wp_pvc_total более эффективным. И это «покрытие».

BNL довольно эффективно, поэтому я не уверен, что этот показатель будет лучше. Но кажется, что отсутствие полезного индекса неэффективно.

В отдельном выпуске KEY post_name (post_name (191)) проблематично c. См http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes

...