Mysql 在这里添加哪个索引?

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

此查询以慢速查询日志结束,因为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
            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。谢谢你的帮助。