1. /* 一、  

  2. * 安全创建索引的存储过程:  

  3. * 首先判断索引是否存在,如果已经存在则不创建,如果不存在,则创建。  

  4. * 防止索引已经存在,创建出错和删除索引重复创建原来的索引带来的开销浪费  

  5. *  

  6. * 参数说明:  

  7. * p_dbname : 数据库名称  

  8. * p_tablename : 表名称  

  9. * p_idxname : 索引名称  

  10. * p_index : 索引名称和结构,比如在 name(name)  

  11. *  

  12. * 举例:比如想要在数据库xxx_db的tablename这张表的字段column1和column2创建联合索引idx_c1c2,则如下:  

  13. * call add_index('xxx_db','tablename','idx_c1c2','idx_c1c2(column1,column2)')  

  14. */

DROP PROCEDURE 
IF EXISTS add_Index; 
delimiter // 
CREATE PROCEDURE add_Index ( 
    IN p_dbname VARCHAR (200), 
    IN p_tablename VARCHAR (200), 
    IN p_idxname VARCHAR (200), 
    IN p_index VARCHAR (200) 
) 
BEGIN 
    DECLARE 
        str VARCHAR (250); 
    
SET @str = concat( 
    ' ALTER TABLE ', 
    p_tablename, 
    ' ADD INDEX ', 
    p_index 
); 
    
SELECT 
    count(*) INTO @cnt 
FROM 
    information_schema.statistics 
WHERE 
    TABLE_SCHEMA = p_dbname 
AND table_name = p_tablename 
AND index_name = p_idxname; 
    
IF @cnt <= 0 THEN 
    PREPARE stmt FROM   @str; 
  EXECUTE stmt; 
END 
IF; 
    
END; 
// 
delimiter ; 
    
/* 为my_db的mytable表创建组合索引mytable_idxc1c2(c1,c2)优化查询速度  
 *   
 * */ 
CALL add_Index ( 
    'my_db', 
    'mytable', 
    'mytable_idexc1c2', 
    'mytable_idexc1c2(c1,c2)' 
);