Mysql 在这里添加哪个索引?
此查询以慢速查询日志结束,因为join没有索引。我应该添加哪个索引,在哪里添加?这个简单的查询需要500毫秒到1,2秒的时间。我想它应该很容易在100毫秒内完成Mysql 在这里添加哪个索引?,mysql,sql,Mysql,Sql,此查询以慢速查询日志结束,因为join没有索引。我应该添加哪个索引,在哪里添加?这个简单的查询需要500毫秒到1,2秒的时间。我想它应该很容易在100毫秒内完成 SELECT users.*, user_roles.apirequests, user_roles.downloadrequests, NOW() AS now FROM users INNER JOIN user_roles ON user_roles.id = users.role
SELECT users.*, user_roles.apirequests, user_roles.downloadrequests, NOW() AS now
FROM users
INNER JOIN user_roles ON user_roles.id = users.role
WHERE users.rsstoken =
'775e155c780ed5af9119f797f814c714' LIMIT 1;
有关此查询,请参见查询和显示创建表::
SELECT u.*, ur.apirequests, ur.downloadrequests, NOW() AS now
FROM users u INNER JOIN
user_roles ur
ON ur.id = u.role
WHERE u.rsstoken = '775e155c780ed5af9119f797f814c714';
最好的索引是用户(rsstoken,role)
和用户角色(id)
。您已经有了第二个索引,因为id
被声明为主键
您还可以在
用户角色
:用户角色(id、APIRests、downloadrequests)
的索引中包含APIRests
和downloadrequests
。这可能是一个非常小的优化——我通常会反对它,因为id
已经是主键,而且行大小很小。您应该阅读MySQL提供的explain
功能。检查文档以了解这一点。它准确地告诉您它如何尝试使用现有索引以及缺少的内容。您有任何理由在rsstoken列上整理utf8\U unicode\U ci吗?不知道。我没有创建这个表。该列是一个API键。当APIRests和downloadrequests上的索引不用于比较时,它们会有什么帮助?@thebjorn。这使得索引成为查询的覆盖索引。在这种情况下,几乎没有增益,因为第一个键是表的主键。唯一的优点是索引比原始表小,因此可能会有较小的I/O好处。在其他情况下,覆盖索引是非常有益的;但是看起来查询速度并没有加快:-(不太明白为什么。整个数据库也在SSD上。对不起,我错了。在我的PHP中,我仍然使用MySQL的LOWER()函数,这导致它不使用索引。现在运行@25ms:-)谢谢。我的负载在16核机器上从28+降至6 lol。谢谢你的帮助。