2014-09-04 2 views
0

Я просто пытаюсь запустить простой запрос в таблице db, который содержит почти 1 миллион записей. Проблема в том, что для выполнения простого запроса требуется много времени. Пожалуйста, проверьте запрос ниже.Простая настройка запросов MySQL для 1 миллиона записей

Select * from users where (status='active' or status='pending') and 
usertype='buyer' 

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

Я пользуюсь базой данных InnoDB. Мне просто нужны некоторые методы настройки, где я могу получить результаты за долю секунд.

спасибо.

+0

сколько записей вы хотите быть отображены – rohitr

+0

Сколько строк это возвращается? Какой индекс вы попробовали (один по типу пользователя, статус должен помочь)? Вы можете показать план запроса? – Thilo

+1

Даже без индексов простой запрос, подобный этому, в одной таблице с 1 миллионом строк не должен принимать «часы». Вы преувеличиваете? Или возможно, что «пользователи» действительно представляют собой представление или имеют очень длинные столбцы text/blob? –

ответ

0

Создать Index.

Более подробная информация здесь:

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

и здесь: http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html

Я предпочитаю ВТКЕЕ (или пользовательский тип) индекс с ограничением.

+0

Могу ли я точно узнать, как будет использоваться индекс btree для моего требования? –

0

Во-первых, написать запрос, как это:

Select * 
from users 
where status in ('active', 'pending') and usertype = 'buyer'; 

in просто намного проще, чем читать кучу or с.

Далее создайте следующий индекс:

create index users_usertype_status on users(usertype, status); 
+0

Я сделал то, что предложил, но не нашел разницы. –

+0

@ пользователь3264996. , , Замените 'select *' на 'select count (*)'. Если это выполняется быстро, то вероятным виновником является ваше подключение к серверу. –

0

Ok ....

У вас есть три уровня настройки.

Физический тюнинг: Купить еще Диски.

Настройка физического уровня: Создать индекс как создать индекс idx_users_status для пользователей (статус); создать индекс idx_users_usertype для пользователей (тип пользователя);

И вы можете так работать с представлениями в качестве результата.

create v_buyers as Select * from users where usertype='buyer'; 
select * from v_buyers where status in ('active', 'pending'); 

Это может обеспечить тюнинг-эффект на многоядерных машинах.

+0

Спасибо, Денис. Я использую AWS db.m3.large экземпляр RDS. Как вам известно, это хорошая конфигурация. Я уже создал индексы всех возможных путей, но не повезло. Я не считаю, что представления работают для меня, так как требуется время на создание/обновление представления. Также следующий запрос также занимает часы времени для выполнения. Выберите * от пользователя, в котором находится статус ('active', 'pending'); –

0

Ok, если ваши данные время сферы вы можете использовать RANGE Переразметку

CREATE TABLE employees (
id INT NOT NULL, 
fname VARCHAR(30), 
lname VARCHAR(30), 
hired DATE NOT NULL DEFAULT '1970-01-01', 
separated DATE NOT NULL DEFAULT '9999-12-31', 
job_code INT NOT NULL, 
store_id INT NOT NULL 
) 
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6), 
PARTITION p1 VALUES LESS THAN (11), 
PARTITION p2 VALUES LESS THAN (16), 
PARTITION p3 VALUES LESS THAN (21) 
); 

Или List - Разметку над «покупателем»

CREATE TABLE employees (
id INT NOT NULL, 
fname VARCHAR(30), 
lname VARCHAR(30), 
hired DATE NOT NULL DEFAULT '1970-01-01', 
separated DATE NOT NULL DEFAULT '9999-12-31', 
job_code INT, 
store_id INT 
) 
PARTITION BY LIST(store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17), 
PARTITION pEast VALUES IN (1,2,10,11,19,20), 
PARTITION pWest VALUES IN (4,12,13,14,18), 
PARTITION pCentral VALUES IN (7,8,15,16) 
);