нужно ускорить мою базу данных или запрос как-то - PullRequest
0 голосов
/ 23 января 2011

У меня есть левый оператор соединения для 2 таблиц: в tbl1 содержится около 1 миллиона записей, а в tbl2 - около 20 миллионов. Выполнение запроса занимает около 9 секунд. У меня есть индексы на обоих, но что-то кажется неправильным, учитывая, сколько времени занимают запросы. Вот мое утверждение:

EXPLAIN SELECT * FROM (SELECT tbl1.id, tbl1.name, tbl2.addr FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL) as tempTable GROUP BY id LIMIT 10;

+----+-------------+------------+--------+------------------+--------------+---------+----------------| 
id|select_type| table     |type  |poss_keys|key |key_len|ref         | rows | Extra 
+----+-------------+------------+--------+------------------+--------------+---------+----------------
1 | PRIMARY   | <derived2>|system| NULL    |NULL| NULL  |NULL        |    0 | const row not found |
2 | DERIVED   | tbl1      |range |id,name  |name| 903   |NULL        |    1 | Using where         |
2 | DERIVED   | tbl2      |ref   |id,addr  |id  | 4     |tbl2.tbl1.id|   25 | Using where         |
+----+-------------+------------+--------+------------------+--------------+---------+----------------

UPDATE: Если я вынимаю оператор соединения и просто выбираю записи из таблицы tbl1 или из таблицы tbl2 по отдельности, операторы выбора выполняются быстро (не более 1 секунды), но когда я пытаюсь присоединиться к ним, тогда это заметно замедляет их ... правильно ли я присоединяюсь к ним или мне нужен какой-то специальный индекс для объединений?

Ответы [ 2 ]

1 голос
/ 23 января 2011

Вы могли бы немного упростить это ... Я не думаю, что вам нужна временная таблица или группа ...

  SELECT tbl1.id, tbl1.name, tbl2.addr 
FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id 
WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL

Также ... если кажется, что индекс не работает, вы можете добавить "tble2.id like 'G%'"

0 голосов
/ 23 января 2011

Вы можете попробовать много других методов

Попробуйте использовать

mysql_unbuffered_query 

на стороне php, что ускорит его, я думаю, поскольку вы указали лимит, так как 10 больше не потребуется подсчета

Тогда как результат содержит только 10 результатов

SQL_SMALL_RESULT

Если вы используете опцию SQL_SMALL_RESULT, MySQL использует временную таблицу в памяти.так что маленький запрос результатов быстрее

...