Mysql Правильный запрос для большой таблицы

oopros

Новичок
В mysql есть таблица с историями звонков, в таблице около 100 000 записей (таблица history).
на странице есть Список пользователей, человек 100, нужно возле каждого из них вывести его историю звонков.

Сейчас не совсем правильная реализация:
select date, value from history where num='".$nomer."' order by ID DESC - выполняется 100 раз при формировании списка пользователей.
Соответсвенно как я понимаю нам нужно сделать вместо 100 раз, сделать одно формирование
select date, value from history where num='".$nomer."' or num2='".$nomer."' {итд} order by ID DESC
Правильно ли я понимаю, и можно ли еще как-то ускорить обращение к такой большой таблице.
Заранее спасибо за ответы
 

Фанат

oncle terrible
Команда форума
Если пользователи выводятся лимитом, то да - только так. только вместо num or num использовать num in(,,,) перечисляя все номера через запятую.

Плюс можно использовать PDO, чтобы получить список, уже сгруппированный по пользователям:

PHP:
$arr = []; // твой массив с номерами
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT num, history.* FROM history WHERE num IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($arr);
$data = $stm->fetchAll(PDO::FETCH_GROUP);
в итоге получится массив, проиндексированный по num
 

oopros

Новичок
сейчас попробовал поэкспериментировать со скоростью обработки запросов в консоле phpmyadmin
Запрос подобный:
SELECT * FROM `history` WHERE `num` = '985-55-55-55' ORDER BY `ID` DESC обрабатывался 0,06 сек
SELECT * FROM `history` ORDER BY `ID` DESC а этот 0.0006
Поле num - тип text
Получается при поиске значения скорость обработки увеличивается в 100 раз примерно.

А если я просто сразу в массив буду заносить все 100 000 записей а потом уже отбирать в массиве нужные - насколько такое вариант будет корректен?
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
ну так выполни в phpmyadmin запрос SELECT * FROM `po_istorii` ORDER BY `ID` DESC LIMIT 100000
вместо запроса SELECT * FROM `po_istorii` ORDER BY `ID` DESC LIMIT 25
и посмотри, во сколько раз "увеличится" тебя скорость
 

oopros

Новичок
Да, кстати
это ты сам додумался, или подсказал кто?
по неопытности добавили когда таблицу создавали.

ну так выполни в phpmyadmin запрос SELECT * FROM `po_istorii` ORDER BY `ID` DESC LIMIT 100000
вместо запроса SELECT * FROM `po_istorii` ORDER BY `ID` DESC LIMIT 25
и посмотри, во сколько раз "увеличится" тебя скорость
спасибо, положили на 20 минут хостинг :) Но суть понятна :)
 

Фанат

oncle terrible
Команда форума
В общем, делай, как у меня выше показано.
Это самый оптимальный вариант - один запрос по всем юзерам, которые показаны на странице.
 

Фанат

oncle terrible
Команда форума
Впрочем, есть еще один вариант.
Наверняка история нужна не по всем юзерам. можно вывести юзеров, а историю не запрашивать
И только если кто-то захочет просмотреть, то подгрузить аяксом и показать
 
Сверху