2015-08-05 2 views
2

В существующем проекте у меня есть 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) ? 
+1

В дополнение к EXPLAIN просьба сообщить результат SHOW CREATE TABLE для всех соответствующих таблиц – Strawberry

+0

является keyslog.customers поле целого типа и это индексированный и индексируются users_customer.userID и если поле timestamp в состоянии выполняет большую фильтрацию данных, если да, то оно проиндексировано ... вам также нужно удалить функцию year (timestamp), чтобы использовать ее индекс, если данные фильтруются на основе этого условия .... –

+0

hello strawberry i я не могу запустить show create table, поскольку таблица уже преследуется, есть ли альтернатива? –

ответ

1

users_customer: INDEX(userID, checked) - если userID не является PRIMARY KEY
keyslog: INDEX(customers)
клиенты: INDEX(id) - если он уже не PRIMARY KEY.

Вместо (YEAR(timestamp) = '$year') используйте

timestamp >= '$year-01-01' AND 
timestamp < '$year-01-01' + INTERVAL 1 YEAR 

(оптимизатор не достаточно умны, чтобы сделать очевидную вещь с YEAR().)

Для ясности, переход к синтаксису JOIN...ON.

Узнайте о сводных таблицах: http://mysql.rjweb.org/doc.php/summarytables

Смежные вопросы