带有计算的字段上的MySQL索引

时间:2014-02-04 15:56:38

标签: mysql indexing

我可以在我的托管服务器中看到我的一个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中创建某种索引,这有助于像我编写的新查询一样快地运行旧查询?可以在数学表达式中使用的索引类型吗?

1 个答案:

答案 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)上的索引仍然有用。