Запросы в 2 миллиона + строк: время отклика и оптимизация? (PHP Codeigniter) - PullRequest
2 голосов
/ 11 марта 2011

РЕДАКТИРОВАТЬ: Когда я удаляю индекс в столбце, в котором я ищу, время отклика изменяется от 2,5 до 2,6 сек.Разве разница не слишком большая?

Я пишу небольшое приложение, которое использует плагин jquery для автозаполнения.Пользователь начинает вводить имя своего родного города, и мой код запрашивает таблицу из 2,7 миллионов строк с названиями городов (база данных maxmind city) с помощью AJAX.Я устанавливаю индекс для столбца db, в котором выполняется поиск (название города).

Когда я запускаю следующий запрос (используя активную запись CodeIgniter), класс эталонных тестов CI 2.1922 сек (только для этого запроса,так что это не включает время загрузки html-страницы).

ВЫБРАТЬ * ИЗ ГОРОДОВ, ГДЕ название города нравится "% bang%"

Когда я запускаю тот же запрос в phpmyadmin Iполучить: Запрос занял 0,0068 с


Когда я запускаю

ВЫБРАТЬ * ИЗ ГОРОДОВ, ГДЕ название города LIKE "% bangkok%"

Отчеты эталонного класса CI 2,1951 сек .Когда я запускаю этот же запрос в phpmyadmin, я получаю: Запрос занимает 2,1811 с.

Таким образом, хотя время отклика CI практически одинаково для обоих запросов, те, которые выполняются в phpmyadmin, сильно различаются.

Вопросы

  • Очевидно, что запрос 2,7 миллиона строк будет относительно медленным, но есть ли способ получить приличное время отклика для такой функции автоматического предложения?2,5 секунды слишком медленные.На самом деле, нет быстрого способа поиска с синтаксисом «LIKE» в массиве PHP, содержащем все 2,7 миллиона строк.Будет ли Memcache вариант?

  • Почему различия времени отклика незначительны при использовании CI Active Record, но так сильно отличаются в phpmyadmin?

Ответы [ 4 ]

2 голосов
/ 11 марта 2011

Вы можете получить значительное преимущество ( как минимум в 100 раз быстрее ), проиндексировав столбец, который вы ищете.

Взгляните на 7.3.1. Как MySQL использует индексы .

EDIT

Либо phpmyadmin и ваш тестовый инструмент работают на одном компьютере? Предполагается, что Phpmyadmin работает на той же машине, что и база данных, но инструмент тестирования производительности не смог. При измерении времени инструмент оценки может, вероятно, учитывать перегрузку сетевого времени (а не страницу рендеринга html).

2 голосов
/ 11 марта 2011

Скорее всего, что вы хотите, это три базы данных или карт-три. Это словарная структура данных, и вы можете загрузить все города в своей памяти. Но вы также можете сделать базу данных из него. Затем вы хотите уменьшить сложность дерева до вложенного множества. Карт-три отличается от основ-три или патриция-три в том, что он имеет максимум 2 листа на узел, который затем очень легко сократить до вложенного набора.

1 голос
/ 28 мая 2017

Вы можете создать индекс для поля, к которому вы применяете условие. Но индексирование не будет работать для поиска по шаблону для «% abc%», потому что в этом случае mysql необходимо просматривать каждую запись, чтобы соответствовать критериям для наилучших результатов, вы можете использовать «% abc» или «abc%» только для использования индекса .

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

Например:

объяснить ВЫБРАТЬ * ИЗ городов, ГДЕ название города НРАВИТСЯ "% bangkok%"

1 голос
/ 30 июля 2013

Кеш запросов включен по умолчанию;вам нужно добавить SQL_NO_CACHE в ваш запрос, чтобы обойти:

SELECT SQL_NO_CACHE * FROM TABLE...

Подробнее здесь: MySQL - запретить использование кеша для тестирования скорости запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...