INNER присоединиться слишком долго - PullRequest
0 голосов
/ 25 февраля 2019

Я задал оригинальный вопрос здесь в стеке. Извинения, если это не лучший способ сделать это.

Проблема в том, что у меня есть запрос, даже с INNERJOIN занимает не менее 5 секунд, и мне интересно, есть ли более быстрый способ сделать это.Вот ответ, который мне дали:

` q = "SELECT DISTINCT e2.eventId FROM event_tags e1 INNER JOIN event_tags e2 " \
        "ON BINARY e2.tagName=e1.tagName AND e2.eventId != e1.eventId " \
        "WHERE e1.eventId = {} ORDER BY RAND() LIMIT {}".format(eventId, '10')`

моя таблица тегов выглядит следующим образом

mysql> describe event_tags;

+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| tagId   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| tagName | text             | NO   |     | NULL    |                |
| eventId | int(10) unsigned | NO   | PRI | NULL    |                |
+---------+------------------+------+-----+---------+----------------+

3 rows in set (0.00 sec)

, и у меня есть несколько тегов, и они будут только расти.Когда я делаю счет в таблице тегов, у меня есть 504,402 тега, и то же самое для тега.Как я мог сделать поиск быстрее?

Вот некоторые примеры данных таблицы тегов событий

mysql> select * from event_tags limit 40;
+-------+-------------------------------------------+---------+
| tagId | tagName                                   | eventId |
+-------+-------------------------------------------+---------+
|   261 | Justin Timberlake (Rescheduled from 11/9) |      38 |
|   264 | Rogers Arena                              |      38 |
|   267 | Pop                                       |      38 |
|   271 | Rock                                      |      38 |
|   285 | Justin Timberlake (Rescheduled from 11/8) |      41 |
|   288 | Rogers Arena                              |      41 |
|   291 | Pop                                       |      41 |
|   294 | Rock                                      |      41 |
|   595 | Yogesh Soman                              |      84 |
|   599 | Geetanjali Kulkarni                       |      84 |
|   602 | Bhagyashree Shankpal                      |      84 |
|   606 | Lalit Prabhakar                           |      84 |
|   611 | Sameer Sanjay Vidwans                     |      84 |
|   617 | Drama                                     |      84 |
|   647 | Shrihari Abhyankar                        |      89 |
|   651 | Deepali Borkar                            |      89 |
|   654 | Akash Kamble                              |      89 |
|   657 | Sharavi Kulkarni                          |      89 |
|   660 | Sharav Wadhawekar                         |      89 |
|   667 | Nipun Dharmadhikari                       |      89 |
|   670 | Drama                                     |      89 |
|   689 | Frank Grillo                              |      94 |
|   692 | Jamie Bell                                |      94 |
|   695 | Margaret Qualley                          |      94 |
|   700 | James Badge Dale                          |      94 |
|   704 | Tim Sutton                                |      94 |
|   710 | Drama                                     |      94 |
|   734 | Bruce Dern                                |     101 |
|   739 | Anthony Michael Hall                      |     101 |
|   745 | Sean Astin                                |     101 |
|   749 | Aly Michalka                              |     101 |
|   754 | Victoria Smurfit                          |     101 |
|   759 | Carl Bessai                               |     101 |
|   762 | Drama                                     |     101 |
|   783 | Sarah Clarke                              |     106 |
|   785 | Xander Berkeley                           |     106 |
|   787 | Kristen Gutoskie                          |     106 |
|   790 | Mackenzie Astin                           |     106 |
|   794 | Bobby Campo                               |     106 |
|   798 | Adam Cushman                              |     106 |
+-------+-------------------------------------------+---------+
40 rows in set (0.00 sec)

, а вот оператор CREATE для таблицы:

CREATE TABLE IF NOT EXISTS event_tags(
    tagId INT UNSIGNED NOT NULL AUTO_INCREMENT,
    tagName VARCHAR(40) NOT NULL,
    eventId INT UNSIGNED NOT NULL,
    PRIMARY KEY(tagId, eventId)
);

Вот EXPLAIN длязапрос:

mysql> EXPLAIN SELECT DISTINCT e2.eventId FROM event_tags e1 INNER JOIN event_tags e2 ON BINARY e2.tagName=e1.tagName AND e2.eventId != e1.eventId WHERE e1.eventId = 487 ORDER BY RAND() LIMIT 10
    -> ;
+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra                                        |
+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------+
|  1 | SIMPLE      | e1    | ALL  | NULL          | NULL | NULL    | NULL | 34275 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | e2    | ALL  | NULL          | NULL | NULL    | NULL | 34275 | Using where; Using join buffer               |
+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------+
2 rows in set (0.03 sec)

ОБНОВЛЕНИЕ: я создал индекс для таблицы с:

CREATE INDEX tagsNdx ON event_tags (eventId, tagName(255));

, который теперь выглядит так:

mysql> show index from event_tags; +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | event_tags | 0 | PRIMARY | 1 | tagId | A | 455408 | NULL | NULL | | BTREE | | | | event_tags | 0 | PRIMARY | 2 | eventId | A | 455408 | NULL | NULL | | BTREE | | | | event_tags | 1 | tagsNdx | 1 | eventId | A | 186 | NULL | NULL | | BTREE | | | | event_tags | 1 | tagsNdx | 2 | tagName | A | 186 | 255 | NULL | | BTREE | | | +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 4 rows in set (0.00 sec) Но это все еще медленно.

1 Ответ

0 голосов
/ 25 февраля 2019

Возможна оптимизация:

  1. Удалить столбец "eventId" из первичного ключа (этот шаг не является обязательным и может быть дополнительно уточнен, если хотите).
  2. Создать индекс по столбцу(EventID, имя_тега).
  3. Выполнить команду: ANALYZE TABLE event_tags
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...