数据库索引

索引的作用:

1、利用索引数据库可以快速定位,大大加快查询速度,主要作用
2、表的数据很多,查询需要关联多个表,这个时候索引也可以提高查询速度
3、加快表与表之间的连接速度
4、使用分组和排序时,可以大大减少时间
5、提高数据库恢复数据时的速度。

索引创建的原则:

1、有索引,数据会先进行索引查询,然后定位数据,索引使用不当,反而会增加数据库的负担。
2.主键,外键必须有索引(创建好了主键和外键自动就是索引,不需要额外声明)
3.一个表超过了300行记录,必须要有索引,否则数据库会遍历表的所有数据。
4.互相之间有关联的表,在这个关联字段应该设置索引
5.唯一性太差的字段,不适合创建索引更新太频繁的字段,不适合做索引。
6.经常被where条件匹配的字段,尤其是表数据比较多的,应该创建索引。
7.在经常进行group by(分组)order by(排序)的字段上要建立索引。
8.索引的列的字段越小越好,长文本的字段,不适合建立索引。

索引的副作用:

1索引也需要占用额外的磁盘空间
2innodb表:数据文件本身也是索引,mvisam:索引和数据文件是分离的。
更新一个包含索引的表,要比更新一个没有索引的表花费的时间更多。
更新了值,也就是更新索引。

创建表的时候需要考虑的因素:

1、关联程度3张表,选好关联字段
2、每个字段的长度,也要考虑。
3、设计合理的索引列。
4、表数据,要控制在合理的范围之内。可以在牺牲一定性能的条件下,满足需求。5秒以上就要考虑优化了。10秒以上一般是出问题了。(缓存失效,缓存击穿。缓存雪崩。)

若该语句中的条件并为涉及索引,可以添加索引来进行优化

索引类型单一,条件语句中条件用到的较多,可以尝试组合索引,以此加快查询速度

索引的类型:

1.B-树索引 BTREE
树形结构的索引,也是大部分数据库的默认索引类型。
根节点:树的最顶端的分支节点
分支节点:指向索引里其他的分支节点,也可以是叶子节点
叶子节点:直接指向表里的数据行

  • 查询必须从索引的最左边的列开始。
  • 查询不能跳过某一索引列,必须按照从左到右的顺序进行匹配。
  • 存储引擎不能使用索引中范围条件右边的列。

数据库索引_第1张图片

2.哈希索引:散列索引
把任意长度的输入,通过散列算法变换成固定长度的输出。
散列值…分别对应数据里的列和行
mysqI的默认引擎:INNODB默认的索引类型就是Btree。
MEMORY 引擎可以支持HASH,也是他的默认索引。
先算散列值,然后对应,速度比较慢,比btree慢。
hash的索引匹配:=in () <=>

MySQL 需要读取表中索引列的值来参与散列计算,散列计算是一个比较耗时的操作。也就是说,相对于 B-树索引来说,建立哈希索引会耗费更多的时间。
不能使用 HASH 索引排序。
HASH 索引只支持等值比较,如“=”“IN()”或“<=>”。
HASH 索引不支持键的部分匹配,因为在计算 HASH 值的时候是通过整个索引值来计算的。

数据库索引_第2张图片

普通索引

数据库索引_第3张图片

数据库索引_第4张图片

数据库索引_第5张图片

方式一:直接创建普通索引

CREATE INDEX 索引名 ON 表名 (列名(长度));

方式二:修改表结构的方式创建索引 

 ALTER TABLE 表名 ADD INDEX 索引名(列名);

方法三:创建表时指定索引

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> index 索引名(字段名) );

唯一索引:

unique 与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许空值。
添加唯一键才会创建唯一索引。最好是不要为空。unique not null

数据库索引_第6张图片

方式一:直接创建唯一索引

CREATE UNIQUE INDEX 索引名 ON 表名(字段名);

mysql> create unique index phone_index on info(phone);

方式二:修改表结构的方式增加唯一键 

ALTER TABLE 表名 ADD UNIQUE 索引名(字段名);

 mysql> alter table info add unique id index(id);

方式三:创建表时指定索引 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> unique 索引名(字段名) );

方法四:添加唯一键,即为唯一索引 

alter table 表名 add unique key(字段);

mysgl> alter table info add unique key(name);

主键索引的创建

主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值,且该字段为唯一值。 添加主键将自动创建主键索引。

方式一:创建表时添加主键 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> primary key (字段) );

方式二: 在现有表中添加主键

ALTER TABLE 表名 add primary key(字段名);

mysql> alter table info add primary key(id);

组合索引的创建  

组合索引(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。

需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

方法一:直接创建索引 

CREATE INDEX 索引名 on 表名(字段1,字段2,字段3);

mysql> create index  id_name_sex on info(id,name,sex);

方法二:修改表的方式创建索引

alter table 表名 add index 索引名(字段1,字段2, ..., 字段n);

方法三:创建表的时候指定索引 

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    -> idnex 字段1_字段2_index(字段1,字段2) );

使用方法

select */需求字段 from 表名 where 索引字段1=? and 索引字段2=? and 索引字段3=?

数据库索引_第7张图片

全文索引的创建 

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。

全文索引可以在CHAR、 VARCHAR 或者TEXT 类型的列上创建。

每个表一般只创建一个全文索引。

查询时只能匹配完整的单词/字符串。

方法一:直接创建索引 

create fulltext index 索引名 on 表名 (字段);

mysql> create fulltext index remark_index on info(remark);

方式二: 修改表的方式创建索引

alter table 表名 add fulltext 索引名 (字段);

 方法三:创建表时指定索引

mysql> create table if not exists info(
    -> id int(5),
    -> name char(4),
    -> sex char(2),
    -> age char(3),
    -> adress varchar(20),
    -> remark varchar(50) 
    ->  fulltext idnex 字段_index(字段) );

全文索引在查询中使用方法 

select * from 表名 where match(字段名) against(单词/字符串);

数据库索引_第8张图片

索引删除的通用方式

其他索引的删除方法

 drop index 索引名 on 表名;      #直接删除索引
 alter table 表名 DROP index 索引名;   #以修改表的方式删除索引

主键索引的删除方法

alter table 表名 drop primary key;

查看表中存在全部索引的方法

show index from 表名;      #能查看索引的字段和细节,建议以纵向形式查看
show index from 表名\G     #建议使用\G以纵向形式查看
show keys from 表名;
show keys from 表名\G
show create table 表名;    #只能查看索引的字段和名称

explain语句的作用 

当我们写好了查询语句不确定自己是否引用的字段是不是索引字段时,可以在查询语句前添加explain来确定自己是否引用了索引字段 

explain select * from 表名 where 条件语句;

你可能感兴趣的:(数据库)