Mysql(5)索引

mysql索引的建立对于mysql的高效运行是很重要的。索引可以大大提高mysql的检索速度。

创建索引时,需要确保该索引是应用在sql查询语句的条件(一般作为where子句的条件)

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

缺点:过多的使用索引会造成滥用,虽然索引大大提高了查询速度,同时却会降低更新表的速度(增删改)。 因为更新表的时候,mysql不仅要保存数据,还要保存一下索引文件。

普通索引

最基本的索引,没有任何限制。

create index indexName on mytable (userName(length) )

创建 索引 索引名 on 表名 列名(长度)

如果是 char,varchar类型,length可以小于字段实际长度。如果是blob和text类型,必须指定length。

修改表结构(添加索引)

alert table tableName add index indexName(columnName)

创建表的时候直接指定

create table mytable(userName varchar(50) not null,index[indexName] (userName(50)));

删除索引的语法

drop index [indexName] on table

唯一索引

与前面的普通索引类似,不同的是,索引列的值必须唯一,但允许空,如果是组合索引,则列值的组合必须唯一。

创建唯一索引

create unique index indexName on table (userName(length))

修改表结构

alert table mytable add unique[indexName] (userName(length))

创建表的时候直接指定唯一索引

create table mytable (userName varchar(50) not null , unique[indexName](userName(length)));

使用alter命令添加和删除索引

1.alert table tblname add primary key (column_list);该语句添加一个主键,这意味着索引值必须是唯一的,且不能为null

2.alert table tbl_name add unique index_name(column_list);这条语句创建索引的值必须是唯一的(除null外,null可能会出现多次)

3.alert table tbl_name add index index_name(column_list);添加普通索引,索引值可出现多次

4.alter table tbl_name add fulltext index_name (column_list) ; 该语句制定了索引为fulltext 用于全文索引

——————————分割

注意事项

1.索引不要去参加计算 因为如果索引列参与计算就不会用到索引

2.索引不要去使用函数运算 因为如果索引列使用了函数计算就不会用到索引

3.正则表达式不使用索引

4.索引列like不要在前面加 %

如name为索引列 name like (‘%小白%’)是不走索引的 name like (‘小白%’)是走索引的

5.字符串与数字比较不适用索引

6.如果条件使用了or or两边的字段都要有索引 有一个没有索引则不走索引 例:

name加了索引 sex没有加索引 name=’xx’ or sex=’xx’ 这就不会走索引 就是正常的查询速度

7.如果估计全表扫描比索引快,就不用索引。

使用技巧

使用索引时,有一些技巧:

1.索引不会包含有NULL的列

只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。

2.使用短索引

对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

3.索引列排序

mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。

4.like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。

5.不要在列上进行运算

6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

7.索引要建立在经常进行select操作的字段上。

这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

8.索引要建立在值比较唯一的字段上。

9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。

10.在where和join中出现的列需要建立索引。

11.where的查询条件里有不等号(where column != …),mysql将无法使用索引。

12.如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。

13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。

    原文作者:小宇
    原文地址: https://zhuanlan.zhihu.com/p/68301444
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞