2015-11-03 4 views
0

У меня довольно большой db (файл дампа 800 + Mb), который я импортировал на свой локальный сервер. Его Wordpress db от ведьмы мне нужно извлечь определенные сообщения. Внутри находится около 160000 сообщений.MySQL очень длинные запросы

В настоящее время я тестирую немного с помощью MySql Workbench, выполняющего простые запросы с помощью JOIN, и для этого требуется много времени, поэтому на самом деле Workbench перестает обрабатывать.

здесь `s пример:

SELECT 
    COUNT(*) 
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_terms 
    ON wp_term_taxonomy.term_id = wp_terms.term_id 
WHERE wp_terms.term_id = 195; 

Бег в течение 600 секунд. Вот WordPress дб схема: enter image description here

Конечно шанс, я просто плохо SQL, на самом деле не мое поле ...

ответ

0

Если у вас есть все индексы на столбцах, которые вы используете для соединения (wp_posts .ID, wp_term_relationships.object_id и т. Д.), Это не должно быть проблемой, и запрос должен выполняться менее чем за 1 секунду (1 сек тоже много).

Кроме того, может быть ожидание других запросов в очереди (замки), так что вы должны добавить это к тем запросам:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

SELECT 
COUNT(*) 
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_terms ON wp_term_taxonomy.term_id = wp_terms.term_id 
    WHERE 
wp_terms.term_id = 195; 

COMMIT ; 

Создание индексов в верстаке. Я вижу здесь, что вы присоединяетесь к идентификаторам на каждой таблице, поэтому, поскольку это столбцы с идентификаторами, они должны быть PRIMARY KEY и создавать на них UNIQUE кластерный индекс.

+0

Нет других вопросов, которые я знаю. Я не думаю, что таблица индексируется. Я получил его как дамп и импортировал его на большой файл txt (куча запросов). Если я проиндексирую его в workbench MySQL, а затем подключился к нему с помощью Eclipse (JAVA), таблица будет индексироваться? – klo

+0

Я обновил свой ответ. – Amel

+0

Проблема заключалась в том, что во время импорта db последние две запросы не выполнялись, большинство из них индексировались. – klo

0

Если вы действительно просто работает подсчет вы можете получить результат с:

SELECT COUNT(*) 
    FROM wp_term_relationships wtr 
    JOIN wp_term_taxonomy wtt 
    ON wtt.term_taxonomy_id = wtr.term_taxonomy_id 
    WHERE wtt.term_id = 195; 

Вам не нужна информация из обязательных wp_terms или wp_posts записей, которые прикреплены к этим записям. Вам также не нужен LEFT JOIN, поскольку вы отбрасываете NULL кортежи с вашим WHERE состоянии.

Что касается скорости, я бы предложил запустить запрос с EXPLAIN и проверить, что все индексировано правильно, и эти индексы используются.

+0

Это просто пробный тест. Мне действительно нужно извлекать данные из таблицы, поэтому требуется объединение. – klo

Смежные вопросы