Как я могу оптимизировать этот запрос? - PullRequest
0 голосов
/ 30 января 2011
SELECT * 
FROM tfdata,linkdata,gndata,serdata 
WHERE tfdata.web = linkdata.web 
  AND tfdata.web = gndata.web 
  AND tfdata.web = serdata.web 
  AND tfdata.web = '"mysql_real_escape_string($uri)"'"

Мне кажется, что этот метод медленный, и я хочу знать, будет ли LEFT JOIN работать над этим? Если да, то как мне добавить то же самое, или есть какой-то другой способ?

Ответы [ 3 ]

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

Вы можете назвать клетки, которые вы ищете, вместо "*".Это улучшит производительность ...

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

Вы можете переписать свой запрос с помощью объединений. Это сделает его более читабельным, но не быстрее.

SELECT *
FROM tfdata
JOIN linkdata ON tfdata.web = linkdata.web
JOIN gndata ON tfdata.web = gndata.web
JOIN serdata ON tfdata.web = serdata.web
WHERE tfdata.web = 'some_uri'

Одно преимущество (но не единственное) этого синтаксиса состоит в том, что он облегчает переход от использования внутреннего соединения к внешнему соединению.

Для оптимизации я сначала начал бы с запуска EXPLAIN SELECT ..., чтобы убедиться, что у вас есть индекс для столбца web для каждой таблицы и что этот индекс фактически используется оптимизатором. Если индекс отсутствует, то его добавление, скорее всего, повысит скорость вашего запроса.

Если запрос возвращает много строк или столбцов, вы можете повысить производительность, только возвращая нужные столбцы и возвращая только первые несколько строк и реализуя подкачку, если хотите увидеть еще несколько строк.

0 голосов
/ 30 января 2011
SELECT * FROM 
    ( SELECT * FROM tfdata WHERE tfdata.web='"mysql_real_escape_string($uri)"'") As Result1,linkdata,gndata,serdata 
    WHERE Result1.web = linkdata.web AND Result1.web = gndata.web AND Result1.web = serdata.web 

Используйте встроенный выбор, чтобы получить таблицу результатов с меньшим количеством элементов, а затем объедините их все вместе.

...