2011-01-30 1 views
0
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 работать над этим? если да, как мне добавить то же самое? или есть другие пути вокруг?Как я могу оптимизировать этот запрос?

+0

Пожалуйста, разместите вывод 'SHOW CREATE TABLE ...' для каждой таблицы и вывода 'EXPLAIN SELECT ...'. –

ответ

1

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

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

Да У меня есть индекс unque для каждой таблицы – leon

+0

Мне нужно использовать mysql_fetch_assoc или mysql_fetch_array для выше – leon

+0

@leon: Который вы используете, не будет иметь существенного отличия от производительности запроса в целом. Из документации: * Важно отметить, что использование 'mysql_fetch_assoc()' не значительно медленнее, чем использование 'mysql_fetch_row()', в то время как оно обеспечивает значительное добавленное значение. * То же самое относится к 'mysql_fetch_array()'. –

0
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 

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

1

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