Улучшение производительности PHP MYSQL-запросов или проблема с сервером? - PullRequest
2 голосов
/ 21 августа 2011

У меня есть этот запрос:

SELECT
a.codigo AS code, a.nome AS name, a.especialidade AS expertise, a.telemovel1 AS mobile, a.email AS email, a.codigopostal AS zipcode
FROM table_name_a a
WHERE a.nome != ''
AND a.codigo!='5555555'
AND a.codigo!='705416'


UNION ALL

SELECT
b.cod AS code, b.nome AS name, b.especialidade AS expertise, b.telem1 AS mobile, b.mail AS email, b.cp AS zipcode
FROM table_name_b b
WHERE b.nome != ''
AND b.cod!='5555555'
AND b.cod!='705416'
AND b.cod NOT IN(SELECT assoc.codigo from table_name_a assoc) 

ORDER BY code ASC

Таблица A: +/- 6000 строк (и растет)

Таблица B: +/- 2000 строк (и растет)

Проблема:

Когда сервер используется одним или двумя пользователями, выполняющими несколько запросов к базе данных, этот запрос работает нормально ... но когда сервер используется, скажем, в течение дня, когда 10 пользователей делают несколько запросов и около + / - 1000 клиентов в любой данный час, выполняющие некоторые запросы, запрос поступает из:

Показаны строки 0 - 29 (всего 7 138, запрос занял 0,0734 с)

до

Показаны строки 0 - 29 (всего 7 138, запрос занял 100,0933 с)

Просить:

Это проблема производительности запроса или проблема в конфигурации / производительности сервера?

РЕДАКТИРОВАНИЕ:


tables indexes

Типы полей:

треска, codigo -> int (11)

nome, telemovel1, telem1, especialidade, codigopostal, cp -> varchar (200)

электронная почта -> varchar (400)

ПОЯСНЯТЬ ЗАПРОСЫ:


Explain Question Query and Query From Karolis

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

Чтобы попытаться выяснить, как оптимизировать запрос, вы должны получить план запроса. Это будет определять, какие индексы используются и как вы можете улучшить их. См. Ключевое слово EXPLAIN в MySql.

Имея эту информацию в руках, вы можете убедиться, что у вас есть правильные индексы. Также вы можете рассмотреть временные таблицы.

0 голосов
/ 21 августа 2011

Предлагаю переписать это:

AND b.cod NOT IN (SELECT assoc.codigo from table_name_a assoc) 

в это:

AND NOT EXISTS (SELECT * FROM table_name_a assoc WHERE assoc.codigo = b.cod)

Переписанный запрос должен использовать меньше памяти, оставляя больше ее для параллельных процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...