2014-11-21 3 views
0

I имеет следующий (упрощенный) Mysql таблица:MySQL Performance и Memcache

Requests: 
    +----------------------+--------------+------+-----+---------+-------+ 
    | Field    | Type   | Null | Key | Default | Extra | 
    +----------------------+--------------+------+-----+---------+-------+ 
    | ID     | bigint(20) | NO | PRI | NULL |  | 
    | UniqueIdentifier  | varchar(255) | YES | MUL | NULL |  | 
    | UniversalServiceId | bigint(20) | YES | MUL | NULL |  | 
    +----------------------+--------------+------+-----+---------+-------+ 

Наблюдение:

+---------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+---------------------+--------------+------+-----+---------+-------+ 
| ID     | bigint(20) | NO | PRI | NULL |  | 
| Value    | varchar(255) | NO |  | NULL |  | 
| RequestId   | bigint(20) | NO | MUL | NULL |  | 
+---------------------+--------------+------+-----+---------+-------+ 

Я индексировал UniqueIdentifier, UniversalServiceId и RequestID.

Таблицы запрашиваются на UniqueIdentifier и UniversalServiceId с помощью JOIN on RequestId.

Таблица наблюдений содержит много миллионов записей. Запросы очень медленно возвращаются, и мне интересно, есть ли что-то, что я могу сделать для повышения производительности. Я только что начал читать о memcache, но кажется, что он может быть полезен только после первого запроса (который часто является единственным) для конкретного набора данных.

Это они типа запроса, который используется:

select * from Observations where RequestId in (select ID from Requests where UniqueIdentifier = '123456' and UniversalServiceId = '1234' 

Любые советы/рекомендации оценили!

ответ

1

Я рекомендую использовать запрос, используя операцию JOIN, а не предикат IN (subquery).

Например:

SELECT o.ID 
    , o.Value 
    , o.RequestId 
    FROM Observations o 
    JOIN Requests r 
    ON r.ID = o.RequestId 
WHERE r.UniqueIdentifier = '123456' 
    AND r.UniversalServiceId = '1234' 

Для достижения оптимальной производительности, подходящие индексы будут:

... ON Requests (UniversalServiceId, UniqueIdentifier, ID) 
... ON Observations (RequestId, Value, ID) 

(Выбор ведущего столбца в индексе на столе запросы будет зависеть от ожидаемой мощности .)

+0

Правильно ли я говорю, что Memcache не повлияет на производительность в этом случае? – skyman

+0

memcached не сделает ничего, чтобы ускорить выполнение запроса к базе данных. Но это может повысить производительность вашего приложения, сохраняя часто используемые данные в памяти, поэтому вам не нужно запускать запрос к базе данных; что поможет в производительности базы данных, если вы можете разгружать повторяющиеся запросы для получения той же информации, избегая ненужных запросов к базе данных. Но если запрос базы данных медленный, я бы сначала рассмотрел эту проблему ... используйте EXPLAIN, чтобы показать план выполнения; множество способов улучшить производительность MySQL, увеличить размер пула буферов InnoDB, чтобы уменьшить ожидания ввода-вывода, использовать InnoDB, а не MyISAM и т. д. – spencer7593