最近我检查了我的系统日志,我注意到我的一些查询非常慢。
我有一个存储用户活动的表。表结构为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
编号相同?我应该遵循的最佳做法是什么?
此表已被主动使用,其中包含超过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
答案 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。
索引有助于SELECTs
和UPDATEs
,有时甚至很多。使用它们。副作用很小 - 例如使用额外的磁盘空间。