索引在庞大的数据库上最能体现出作用,所谓索引就是根据需求将指定的列提取出来做索引表,可以显著提高在查找数据方面的速度。
在索引的前提下还可以指定索引值是否唯一,索引值是单列或是多列索引。
根据索引类型,索引分为:
普通索引:
name,只能帮助查找
唯一索引:
name,只能帮助查找,内容不允许重复,可以为null,但也限制唯一。
主键索引:
name,只能帮助查找,内容不允许重复,不允许null,一张表只能有一个主键,但也可以通过unique进行组合
组合索引:
多列共同组成索引,可以有如下模式,1 是不约束的就是说不唯一,2是唯一的
普通多列索引(name,email)
联合唯一索引(name,email)
根据索引方式又分为:
覆盖索引
当查询的数据是从索引表里面查找的,则是覆盖索引
索引合并
将两个单独的索引放到一起,就是索引合并。
默认的查找方式是全表扫描。
在创建表时创建索引:
create table person(id int not null primary key auto_increment,name char(10) not null,age int not null,address varchar(100) not null,index index_name(name));
普通索引:
create index index_name on person(pname);
删除索引:
drop index_name on tableName;
查看索引:
show index from tableName;
唯一索引:
建表时创建唯一索引:
create table person(id int not null primary key auto_increment,name char(10) not null,age int not null,address varchar(100) not null,unique index_name(name));
创建唯一索引:
creae unique index index_name on tableName(ColumnName);
删除唯一索引:
drop unique index index_name on tabeName;
主键索引:
创建表时创建索引:
create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) ) OR create table in1( nid int not null auto_increment, name varchar(32) not null, email varchar(64) not null, extra text, primary key(ni1), index ix_name (name) ) 创建表 + 创建主键
创建索引:
alter table tableName primary key(ColumnName);
删除索引:
方式一: alter table tableName drop primary key; 方式二: alter table tableName modify ColumnName int,drop primary key;
组合索引:
设有如下表:
create table tb1(id int not null primary key auto_incremet,name char(10) not null,age int(2) not null,other text)engine=innoDB default charset=utf8;
创建组合索引:
create index index_name on tableName(columnName1,columnName2);
如上创建组合索引之后,查询:
- name and email -- 使用索引
- name -- 使用索引
- email -- 不使用索引
注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。
other:
explain 关键字可以查看查询语句是通过何种方式查找数据。
explain select * from person where xx=xx;
如果type列示 all则表示全表扫描
如果是ref 则是通过索引查找的
all 表示 全表扫描
ref 表示 普通索引查找
const 唯一索引查找 / 主键索引也是const
组合索引 表示
在全表扫描模式下,如果想达到索引效果,可以用limit 1; 如果只要求一条数据的话。limit 1 表示取得一条数据后就返回。
在 like 模式下, 如果 "%xx" 模式一般不走索引模式,因为前缀为% 表示一切皆有可能, 如果要走索引模式 必须为: “xx%”
reverse(列名) 也一样不走模式。除非是值 reverse(value)
对于比较运算符 来说 一般除了大于 和 不等于 不走索引外,其余的一般都走索引。
对于 or 运算符 ,只有 当or 两边的索引都是索引才走索引,否则不走。