初始化场景:没有就创建,有的话就不做任何的处理
-- 定义数据库、表名、索引名、作为复合索引的字段(只有一个也行,就是给某个字段加索引了)
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;