MariaDB - я должен добавить индекс к моей таблице? - PullRequest
0 голосов
/ 07 мая 2018

Недавно я проверял свои системные журналы и заметил, что некоторые из моих запросов очень медленные.

У меня есть таблица, в которой хранятся пользовательские активности. Структура таблицы id (int), user (int), type (int), object (varchar), extra (mediumtext) and date (timestamp).

Также у меня есть индекс только для id (BTREE, unique).

У меня проблемы с производительностью для следующего запроса;

SELECT  DISTINCT object as usrobj
    from  ".MV15_PREFIX."useractivities
    WHERE  user='".$user_id."'
      and  type = '3'
    limit  0,1000000" 

Вопрос в том, должен ли я индексировать user так же, как id? Какой должна быть лучшая практика, которой я должен следовать?

Эта таблица активно используется и содержит более 500 000 строк. И на сайте в среднем 2k ~ одновременных пользователей.

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

Заранее спасибо за предложения.

Примечание:

Результат mysqltuner

Общие рекомендации:

Reduce or eliminate persistent connections to reduce connection usage
Adjust your join queries to always utilize indexes
Temporary table size is already large - reduce result set size
Reduce your SELECT DISTINCT queries without LIMIT clauses
Consider installing Sys schema from https://github.com/mysql/mysql-sys

Переменные для настройки:

max_connections (> 768)
wait_timeout (< 28800)
interactive_timeout (< 28800)
join_buffer_size (> 64.0M, or always use indexes with joins)

(я установлю max_connections> 768, не совсем уверен насчет тайм-аутов , и поскольку я читаю темы / предложения в Stackoverflow, я думаю, что не должен увеличивать размер join_buffer_size, но я ' Буду очень признателен за отзывы об этих переменных.)

РЕДАКТИРОВАТЬ - ПОКАЗАТЬ ПОКАЗАТЬ результат;

+--------------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table              | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| ***_useractivities |          0 | PRIMARY         |            1 | id          | A         |      434006 |     NULL | NULL   |      | BTREE      |         |               |
| ***_useractivities |          1 | user_index      |            1 | user        | A         |       13151 |     NULL | NULL   |      | BTREE      |         |               |
| ***_useractivities |          1 | user_type_index |            1 | user        | A         |       10585 |     NULL | NULL   |      | BTREE      |         |               |
| ***_useractivities |          1 | user_type_index |            2 | type        | A         |       13562 |     NULL | NULL   |      | BTREE      |         |               |
+--------------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Для запроса , или из них оптимальны:

INDEX(user, type)
INDEX(type, user)

Отдельные индексы (INDEX(user), INDEX(type)), вероятно, будут не такими хорошими.

InnoDB MySQL имеет только BTree, а не Hash. В любом случае, BTree по сути так же хорош, как и Hash для «точечных запросов», и значительно лучше для «диапазонных» запросов.

Индексирование подсказки .

Индексы помогают SELECTs и UPDATEs, иногда очень много. Используй их. Побочные эффекты незначительны - например, используется дополнительное дисковое пространство.

0 голосов
/ 07 мая 2018

Большинство этих практических правил для индексации PostgreSQL применимы к большинству систем управления базами данных SQL.

https://dba.stackexchange.com/a/31517/1064

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

Вы также выиграете, узнав, как читать план выполнения .

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