Mysql添加复合索引-模板

初始化场景:没有就创建,有的话就不做任何的处理

-- 定义数据库、表名、索引名、作为复合索引的字段(只有一个也行,就是给某个字段加索引了)
SET @db_name = 'mailboxes';
SET @table_name = 'task_list';
SET @index_name = 'idx_status_mailbox';
SET @columns = 'control_status, mailbox_id';

-- 创建临时表检查索引是否已存在
DROP TEMPORARY TABLE IF EXISTS tmp_index_check;
CREATE TEMPORARY TABLE tmp_index_check AS
SELECT *
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = @db_name
  AND TABLE_NAME = @table_name
  AND INDEX_NAME = @index_name;

-- 如果索引不存在,就创建索引,否则什么都不做
SET @index_exists = (SELECT COUNT(*)
                     FROM tmp_index_check);
SET @sql = IF(@index_exists = 0,
              CONCAT('CREATE INDEX ', @index_name, ' ON ', @db_name, '.', @table_name, ' (', @columns, ')'),
              CONCAT('SELECT ', ' "Index ', @index_name, ' already exists"', ' AS message')
           );
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

更新场景:保持与主线分支一致(也适用于初始化场景)

-- 定义数据库、表名、索引名、作为复合索引的字段(只有一个也行,就是给某个字段加索引了)
SET @db_name = 'mailboxes';
SET @table_name = 'email_list';
SET @index_name = 'idx_download_retry';
SET @columns = 'download_retry, mailbox_id';

-- 创建临时表检查索引是否已存在
DROP TEMPORARY TABLE IF EXISTS tmp_index_check;
CREATE TEMPORARY TABLE tmp_index_check AS
SELECT *
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = @db_name
  AND TABLE_NAME = @table_name
  AND INDEX_NAME = @index_name;
SET @index_exists = (SELECT COUNT(*)
                     FROM tmp_index_check);

-- 如果索引存在,则删除
SET @sql = IF(@index_exists = 0,
              CONCAT('SELECT  "Index ', @index_name, ' is not exists, will be created"  AS message'),
              CONCAT('DROP INDEX ', @index_name, ' ON ', @db_name, '.', @table_name)
           );
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- 创建索引
SET @sql = CONCAT('CREATE INDEX ', @index_name, ' ON ', @db_name, '.', @table_name, ' (', @columns, ');');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注