MariaDB - 我应该在表格中添加索引吗?

时间:2018-05-07 14:49:13

标签: mysql database mariadb query-performance

最近我检查了我的系统日志,我注意到我的一些查询非常慢。

我有一个存储用户活动的表。表结构为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" 

问题是,我是否还要将userid编号相同?我应该遵循的最佳做法是什么?

此表已被主动使用,其中包含超过500k +行。网站平均有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&gt; 768,不确定超时,到目前为止我读过Stackoverflow中的主题/建议我认为我不应该增加{{}的大小1}}但我真的很感激获得有关这些变量的反馈。)

编辑 - 显示索引结果;

join_buffer_size

2 个答案:

答案 0 :(得分:2)

PostgreSQL索引的大部分经验法则适用于大多数SQL数据库管理系统。

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

所以,是的,您可能会受益于user上的索引和type上的索引。您可以从user, type对上的索引中获益更多。

您也将从read an execution plan学习如何获益。

答案 1 :(得分:0)

对于那个查询,其中 是最佳的:

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

单独的索引(INDEX(user), INDEX(type))可能不会那么好。

MySQL的InnoDB只有BTree,而不是Hash。无论如何,BTree基本上和Hash一样好用于点查询,并且对于&#39;范围来说非常好。查询。

索引tips

索引有助于SELECTsUPDATEs,有时甚至很多。使用它们。副作用很小 - 例如使用额外的磁盘空间。