三、MySQL 索引分类
3.1 单值索引
概念:即一个索引只包含单个列,一个表可以有多个单列索引
语法:
//所表一起创建: CREATE TABLE customer ( id INT(10) UNSIGNED AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200), PRIMARY KEY(id), KEY (customer_name) // Σ(っ °Д °;)っ ); //单独建单值索引: CREATE INDEX idx_customer_name ON
3.2 唯一索引
概念:索引列的值必须唯一,但允许有空值
//随表一起创建: CREATE TABLE customer ( id INT(10) UNSIGNED AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200), PRIMARY KEY(id), KEY (customer_name), UNIQUE (customer_no) // Σ(っ °Д °;)っ ); //单独建唯一索引: CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no);
3.3 主键索引
概念:设定为主键后数据库会自动建立索引,innodb为聚簇索引
//随表一起建索引 CREATE TABLE customer ( id INT(10) UNSIGNED AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200), PRIMARY KEY(id) // Σ(っ °Д °;)っ ); //单独建主键索引: ALTER TABLE customer add PRIMARY KEY customer(customer_no); //删除建主键索引: ALTER TABLE customer drop PRIMARY KEY ; //修改建主键索引: 必须先删除掉(drop)原索引,再新建(add)索引
3.4 复合索引
概念:即一个索引包含多个列
随表一起建索引:
CREATE TABLE customer ( id INT(10) UNSIGNED AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200), PRIMARY KEY(id), KEY (customer_name), UNIQUE (customer_name), KEY (customer_no,customer_name) // Σ(っ °Д °;)っ ); 单独建索引: CREATE INDEX idx_no_name ON customer(customer_no,customer_name);
3.5 基本语法
四、索引的创建时机
4.1 适合创建索引的情况
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中与其它表关联的字段,外键关系建立索引
单键/组合索引的选择问题, 组合索引性价比更高
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
查询中统计或者分组字段
4.2 不适合创建索引的情况
表记录太少
经常增删改的表或者字段
Where 条件里用不到的字段不创建索引
过滤性不好的不适合建索引