Давайте начнем с того, что я не могу использовать INDEXING, так как мне нужны INSERT, DELETE и UPDATE, чтобы эта таблица была супербыстрой, какой они есть.
У меня есть страница, которая отображает сводку единиц заказа, собранных в таблице базы данных. Чтобы заполнить таблицу, создается номер заказа, а затем отдельные таблицы, связанные с этим заказом, сканируются в таблицу, чтобы узнать, какие единицы связаны с каждым заказом.
Для целей этого примера таблица имеет следующие столбцы.
id, UID, заказ, отправитель, получатель, дата и время
Количество отдельных единиц может быть в тысячах на заказ, а вся таблица увеличивается до сотен тысяч единиц.
На странице сводки отображается количество единиц в заказе, а также номер первой и последней единицы для каждого заказа. Я ограничиваю количество отображаемых заказов последними 30 номерами заказов.
Например:
Заказ 10 состоит из 200 единиц. первый UID 1510 последний UID 1756
Заказ 11 состоит из 300 единиц. первый UID 1922 последний UID 2831
..........
..........
В настоящее время время ответа на запрос составляет около 3 секунд, поскольку код выполняет следующее:
Поиск последних 30 заказов по идентификатору и сортировка по номеру заказа
При просмотре каждого номера заказа в массиве
- Подсчитать количество строк в базе данных с таким номером заказа
- выберите первый UID из всех строк как первый
- Выберите последний UID из всех строк как последний
- Показать результат
Я определил, что большую часть времени занимает подсчет количества единиц в каждом порядке ~ 1,8 секунды, а затем определение первого и последнего чисел в каждом порядке ~ 1 секунда.
Мне действительно интересно, есть ли способ ускорить эти запросы без INDEXING. Вот код с запросами.
Первый запрос выбирает последние 30 обработанных заказов, выбранных по идентификатору и сгруппированных по номеру заказа. Это дает последние 30 уникальных номеров заказа.
$result = mysqli_query($con, "SELECT order, ANY_VALUE(receiver) AS receiver, ANY_VALUE(originator) AS originator, ANY_VALUE(id) AS id
FROM scandb
GROUP BY order
ORDER BY id
DESC LIMIT 30");
При получении последних 30 номеров заказов подсчитайте количество единиц, а также первый и последний UID для каждого заказа.
while($row=mysqli_fetch_array($result)){
$count = mysqli_fetch_array(mysqli_query($con, "SELECT order, COUNT(*) as count FROM scandb WHERE order ='".$row['order']."' "));
$firstLast = mysqli_fetch_array(mysqli_query($con, "SELECT (SELECT UID FROM scandb WHERE orderNumber ='".$row['order']."' ORDER BY UID LIMIT 1) as 'first', (SELECT UID FROM barcode WHERE order ='".$row['order']."' ORDER BY UID DESC LIMIT 1) as 'last'"));
echo "<td align= center>".$count['count']."</td>";
echo "<td align= center>".$firstLast['first']."</td>";
echo "<td align= center>".$firstLast['last']."</td>";
}
При 100 тыс. Строк в базе данных весь этот запрос занимает около 3 секунд. Большую часть времени составляют запросы $ count и $ firstlast. Я хотел бы знать, есть ли более эффективный способ получить эти же данные за более короткое время без индексации таблицы. Любые специальные уловки, которые кто-либо имеет, будут с благодарностью.