В существующем проекте у меня есть db в phpmyadmin, база данных должна хранить большой объем данных в конечном счете. мне часто нужно будет составлять годовые отчеты для клиентов, когда я рисую отчет с общей записью в базе данных, было около 950 000, время поиска составляло около 15 секунд, что было вполне удовлетворительным до сих пор, однако, когда я ввел 400 000 тестовых данных в базу данных время поиска подскочило с 15 секунд до расстройства времени 2.08 минут. Я попытался запустить дефрагментацию и оптимизировать работу без каких-либо различий во времени.Индексирование этого SQL-запроса для лучшей оптимизации
Я заметил, что таблица не проиндексирована (как и следовало бы в соответствии с некоторыми поисками Google). Мне хотелось бы получить рекомендации о том, как лучше индексировать таблицы, поскольку я новичок в индексировании.
Вот запрос.
$currentuserid = $this->session->userdata('userid');
$year='2008';
$query = $this->db->query("
select customers.id,customers.customername,
sum(if(MONTH(keyslog.timestamp) = 1, keyslog.count, 0)) as January,
sum(if(MONTH(keyslog.timestamp) = 2, keyslog.count, 0)) as February,
sum(if(MONTH(keyslog.timestamp) = 3, keyslog.count, 0)) as March,
sum(if(MONTH(keyslog.timestamp) = 4, keyslog.count, 0)) as April,
sum(if(MONTH(keyslog.timestamp) = 5, keyslog.count, 0)) as May,
sum(if(MONTH(keyslog.timestamp) = 6, keyslog.count, 0)) as June,
sum(if(MONTH(keyslog.timestamp) = 7, keyslog.count, 0)) as July,
sum(if(MONTH(keyslog.timestamp) = 8, keyslog.count, 0)) as August,
sum(if(MONTH(keyslog.timestamp) = 9, keyslog.count, 0)) as September,
sum(if(MONTH(keyslog.timestamp) = 10, keyslog.count, 0)) as October,
sum(if(MONTH(keyslog.timestamp) = 11, keyslog.count, 0)) as November,
sum(if(MONTH(keyslog.timestamp) = 12, keyslog.count, 0)) as December,
sum(keyslog.count) as Total
from customers, keyslog, users_customer
where (YEAR(timestamp) = '$year')
AND customers.id = keyslog.customers
AND users_customer.custo_id = keyslog.customers
AND keyslog.active = '1'
AND users_customer.userID = '$currentuserid'
AND users_customer.checked='1'
group by customers.id,customers.customername
Как сообщил я пытался бежать объяснить и вот результат, однако я не могу интерпретировать его
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE keyslog ALL NULL NULL NULL NULL 1437493 Using where; Using temporary; Using filesort
1 SIMPLE customers eq_ref PRIMARY,id PRIMARY 4 iccid.keyslog.customers 1
1 SIMPLE users_customer ref userID,checked,userID_2 userID_2 12 const,iccid.customers.id,const 1 Using where; Using index
Любое предложение о том, как добавлять индексы, какие таблицы или как изменить запрос, чтобы достичь лучший оптимальный поиск будет высоко ценится
Должен ли я также конкретно нацелены на индексы, которые я добавить в запросе , например
from customers,keyslog,users_customer USE INDEX (PRIMARY) ?
В дополнение к EXPLAIN просьба сообщить результат SHOW CREATE TABLE для всех соответствующих таблиц – Strawberry
является keyslog.customers поле целого типа и это индексированный и индексируются users_customer.userID и если поле timestamp в состоянии выполняет большую фильтрацию данных, если да, то оно проиндексировано ... вам также нужно удалить функцию year (timestamp), чтобы использовать ее индекс, если данные фильтруются на основе этого условия .... –
hello strawberry i я не могу запустить show create table, поскольку таблица уже преследуется, есть ли альтернатива? –