我可以在我的托管服务器中看到我的一个WordPress客户安装了一个名为arrowchat的插件, 该插件使用下面的查询很多次,
SELECT DISTINCT wp_users.ID userid, wp_users.display_name username,
arrowchat_status.session_time lastactivity,
wp_users.user_email avatar, wp_users.ID link,
arrowchat_status.message, arrowchat_status.status
FROM wp_users
JOIN arrowchat_status
ON wp_users.ID = arrowchat_status.userid
WHERE ('1391526259' - arrowchat_status.session_time - 60 < '120')
AND wp_users.ID != 'g2192087'
使用MySQL上的说明显示,逐行读取了arrowchat_status(所有行),即使在arrowchat_status.session_time上创建索引也无济于事,但是当我将WHERE语句更改为低于1时,它只获得70行并且运行得更快。
WHERE (arrowchat_status.session_time > '1391526319')
由于这些代码不是我的,我无法更改我的客户端的代码,是否有可能在MySQL中创建某种索引,这有助于像我编写的新查询一样快地运行旧查询?可以在数学表达式中使用的索引类型吗?
答案 0 :(得分:0)
这样的功能确实存在,称为表达式索引或基于函数的索引。但是,MySQL不支持。
参考:http://use-the-index-luke.com/sql/where-clause/obfuscation/math
!=
条件使索引变得非常困难。如果您在5.6+上运行(因为索引条件下推:http://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html),(userid, session_time)
上的索引仍然有用。