我在MySQL中有一个这样的表,有大量行.

TABLE `Table_1` (
  `InternalId` int(10) NOT NULL AUTO_INCREMENT,
  `Id` varchar(50) NOT NULL,
  `Test_Column` varchar(100)  NULL,
  `Month` int(2) NOT NULL,
  `Year` int(2) NOT NULL,
  PRIMARY KEY (`InternalId`),
  KEY `IX_Id` (`Id`)
) ENGINE=InnoDB;

我需要定期查询表中月/年已过go 且Test_列不为NULL的行,并使用以下查询对它们执行一些操作:

Select * From Table_1 where Test_Column is NULL AND (Year < @currentYear OR (Year = @currentYear AND Month = @currentMonth))

为这些列创建索引的最佳方法是什么?我是否只需要在所有三列上创建一个索引,即年、月、测试列,以及测试列为空的事实是否值得考虑?

推荐答案

这是我试过的.在MySQL 8.0.28中测试:

alter table table_1 
  add column test_column_is_null bool as (test_column is null),
  add column date date as (date(concat(`Year`, '-', `Month`, '-01'))),
  add index (test_column_is_not_null, date);

然后我查看了解释报告以了解您的问题:

EXPLAIN 
SELECT * FROM Table_1 WHERE test_column_is_null = 1 
  AND date < DATE_FORMAT(NOW(), '%Y-%m-01')\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: Table_1
   partitions: NULL
         type: range
possible_keys: test_column_is_null
          key: test_column_is_null
      key_len: 6
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using where

这表明它使用了我添加的索引,key_len表明它使用了索引的两列(1字节表示布尔值,3字节表示日期,还有一些字节表示可空).

Mysql相关问答推荐

是否有一种方法可以在mysql中设置一列,使其自动成为该行的行号的值?

如何在使用VALUES()插入时指定jOOQ中的行别名

S在我的SQL代码中的外键出了什么问题?

Mysql - Select 匹配某些条件的两条记录之间经过的最大天数

SQL查询连接到多个类别的项目

避免多个SQL查询的重构代码

在带有 D.I 的 .NET AWS Lambda 中使用 MySql.Data

为大表优化 Django 模型

Mysql,显示谁已经和没有 Select 退出巴士服务

从三个不同的表中生成两列,并使用分组变量计算这些列的比率

如何在 MYSQL 中使用多个表进行插值

如何根据特定条件从mysql数据库中 Select 查询

如何使用 laravel 连接 mysql?

MySQL 5.6 DATETIME 不接受毫秒/微秒

PHP PDO 与普通 mysql_connect

函数 mysql_real_escape_string 的 PDO 类似功能是什么?

MySQL计算特定值的列

ASP.NET EntityFramework 获取数据库名称

WHERE 子句中的条件顺序会影响 MySQL 性能吗?

在 MySQL 中的子查询上使用 GROUP_CONCAT