Сортировка производительности запросов в PHP + MYSQL - PullRequest
0 голосов
/ 07 июня 2018

У меня есть таблица с огромным количеством записей.Когда я запрашиваю эту конкретную таблицу специально, когда в запросе используется ORDER BY , это занимает слишком много времени.

Как я могу оптимизировать эту таблицу для Сортировка & Поиск ?

Вот пример схемы моей таблицы ( jobs ):

+---+-----------------+---------------------+--+
| id|        title    |         created_at     |
+---+-----------------+---------------------+--+
| 1 | Web Developer   | 2018-04-12 10:38:00 |  |
| 2 | QA Engineer     | 2018-04-15 11:10:00 |  |
| 3 | Network Admin   | 2018-04-17 11:15:00 |  |
| 4 | System Analyst  | 2018-04-19 11:19:00 |  |
| 5 | UI/UX Developer | 2018-04-20 12:54:00 |  |
+---+-----------------+---------------------+--+

Я долго искал, я узнал, что создание INDEX может помочь улучшить производительность, может кто-нибудь рассказать, как можно увеличить производительность?

Ответы [ 4 ]

0 голосов
/ 09 июня 2018
ALTER TABLE jobs
    ADD INDEX(created_at);

(Да, существует синтаксис CREATE INDEX, который соответствует аналогу.)

Затем в запросе выполните

ORDER BY created_at DESC

Однако с 15M строкамиэто может все еще займет много времени.Будете ли вы фильтровать (WHERE)?LIMITing?

Если вы действительно хотите вернуть пользователю 15M строк - ну, это большой сетевой трафик, и , что займет много времени.

Детали MySQL

Независимо от объявления индекса или версии, ASC/DESC в ORDER BY будет учитываться.Однако для этого может потребоваться «сортировка файлов» вместо использования порядка, встроенного в BTree индекса.

В некоторых случаях WHERE или GROUP BY может привести к тому, что Оптимизатор испортит любойиндекс.Но если это возможно, то ...

(до MySQL 8.0) Хотя можно объявить индекс DESC, атрибут игнорируется.Тем не менее, ORDER BY .. DESC является чтимым;он сканирует данные в обратном направлении.Это также работает для ORDER BY a DESC, b DESC, но не при наличии комбинации ASC и DESC в ORDER BY.

MySQL 8.0 действительно создает индексы DESC;то есть, BTree, содержащее индекс, сохраняется «назад».

0 голосов
/ 07 июня 2018

Если вы хотите заработать на производительности по вашему запросу, есть способ разбить его на страницы.Таким образом, вы можете установить лимит (как хотите) и указать страницу, которую хотите отобразить.

Например SELECT * FROM your_table LIMIT 50 OFFSET 0.

Не знаю, поможет ли этот ответ вам в вашей проблеме, но вы можете попробовать;)

0 голосов
/ 07 июня 2018

Индексы - это способ создания деревьев поиска (в большинстве случаев B-деревьев) для более эффективной сортировки, фильтрации и поиска строк.

Индексы используются для быстрого поиска строк с конкретными значениями столбцов.Без индекса MySQL должен начинаться с первой строки, а затем читать всю таблицу, чтобы найти соответствующие строки.Чем больше стол, тем больше это стоит.Если таблица имеет индекс для рассматриваемых столбцов, MySQL может быстро определить позицию, которую нужно искать в середине файла данных, не просматривая все данные.Это намного быстрее, чем последовательное чтение каждой строки.https://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html

Вы можете использовать EXPLAIN, чтобы помочь определить, как выполняется запрос в настоящее время, и определить области улучшения.Важно не переиндексировать таблицу по причинам, которые, возможно, выходят за рамки этого вопроса, поэтому было бы хорошо провести некоторое исследование по эффективному использованию индексов.

0 голосов
/ 07 июня 2018

Добавьте слово "объяснение" перед вашим запросом и проверьте результат

explain select ....

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

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