千家信息网

字段使用函数索引被抑制

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,在索引字段上使用函数,该字段的索引将会被抑制。如下案例:查看表结构:点击(此处)折叠或打开mysql> show create table test06 \G*********************
千家信息网最后更新 2025年01月24日字段使用函数索引被抑制在索引字段上使用函数,该字段的索引将会被抑制。如下案例:
查看表结构:

点击(此处)折叠或打开

  1. mysql> show create table test06 \G
  2. *************************** 1. row ***************************
  3. Table: test06
  4. Create Table: CREATE TABLE `test06` (
  5. `id` bigint(11) NOT NULL DEFAULT '0',
  6. `u_id` bigint(11) NOT NULL,
  7. `openid` varchar(100) DEFAULT NULL,
  8. `unionid` varchar(100) DEFAULT NULL,
  9. `username` varchar(100) NOT NULL,
  10. `password` varchar(100) NOT NULL,
  11. `create_time` datetime NOT NULL,
  12. KEY `idx_test03_id` (`id`),
  13. KEY `idx_test03_name` (`username`),
  14. KEY `idx_test06_crea_time` (`create_time`)
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
使用函数进行查询:

点击(此处)折叠或打开

  1. mysql> select count(*) from test06 where date(create_time)=curdate();
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 0 |
  6. +----------+
  7. 1 row in set (1.00 sec)
不使用函数:

点击(此处)折叠或打开

  1. mysql> select count(*) from test06 where create_time=date_format(curdate(),'%Y-%m-%d');
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 0 |
  6. +----------+
  7. 1 row in set (0.03 sec)
可以看出:查询时间变快很多。
对比一下执行计划:

点击(此处)折叠或打开

  1. mysql> explain select count(*) from test06 where date(create_time)=curdate();
  2. +----+-------------+--------+-------+---------------+----------------------+---------+------+---------+--------------------------+
  3. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  4. +----+-------------+--------+-------+---------------+----------------------+---------+------+---------+--------------------------+
  5. | 1 | SIMPLE | test06 | index | NULL | idx_test06_crea_time | 5 | NULL | 2009559 | Using where; Using index |
  6. +----+-------------+--------+-------+---------------+----------------------+---------+------+---------+--------------------------+
  7. 1 row in set (0.00 sec)

  8. mysql> explain select count(*) from test06 where create_time=date_format(curdate(),'%Y-%m-%d');
  9. +----+-------------+--------+------+----------------------+----------------------+---------+-------+------+-------------+
  10. | id | select_type | table | type | possible_keys key | key_len | ref | rows | Extra |
  11. +----+-------------+--------+------+----------------------+----------------------+---------+-------+------+-------------+
  12. | 1 | SIMP | test06 | ref | idx_test06_crea_time | idx_test06_crea_time | 5 | const | 1 | Using index |
  13. +----+-------------+--------+------+----------------------+----------------------+---------+-------+------+-------------+

0