在MySQL中,有很多看上去逻辑相同,但性能差异巨大的SQL语句。对这些语句使用不当的话,就会不经意导致整个数据库压力变大。本文选择了三个这样的案例。
案例一:条件字段函数操作
假设现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。建表语句如下:
mysql> CREATE TABLE `tradelog` ( `id` int(11) NOT NULL, `tradeid` varchar(32) DEFAULT NULL, `operator` int(11) DEFAULT NULL, `t_modified` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `tradeid` (`tradeid`), KEY `t_modified` (`t_modified`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
目前的需求是,统计发生在所有年份中7月份的交易记录总数。可能会这样写SQL语句:
select count(*) from tradelog where month(t_modified)=7;
但这可能需要执行很久,因为如果对字段做了函数计算,就用不上索引了。为什么呢?
