索引
1、前言
MySQL中有四种索引
- 主键索引
- 常规索引
- 唯一索引
- 全文索引
索引目的
为了增加表的查询效率
经过索引的层层筛选 快速定位数据的位置 避免了全表扫描 数据量越大 效率越明显
2、主键索引
概述
主键索引是关系型数据库中最常见的索引类型 主要的作用是确定数据表中数据的确定的位置
设置
primary key
注意事项
- 最好为每张表去指定一个主键 但不是必须的
- 一个表中只能指定一个主键索引 而且主键的值不能为空 通常配合 auto_increment 来使用
- 字段类型一般设为 int类型
- 主键名称一般为id 也有叫表前缀_id
创建
第一种形式
CREATE TABLE `test3` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
第二种形式
CREATE TABLE `test3` ( `id` int(10) unsigned NOT NULL PRIMARY KEY (`id`) AUTO_INCREMENT, `username` varchar(10) DEFAULT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8
自增步长(了解)
mysql的默认步长是基于session 默认为1
查看步长[ˈvɛriəbəlz]
show session variables like 'auto_inc%';
设置步长 只针对当前的会话
set session auto_increment_increment = 2; # 将步长设置为2
设置全局步长
set global session auto_increment_increment = 2;
注意:
当数据删除以后 自增位置并不会改变
自增归位:
- truncate 表名; 清空表并将自增归位
- alter table test3 auto_increment=1;
3、常规索引
概述
常规索引是关系型数据库中查询最重要的技术 如果想要提升数据库的效率 那么索引优化是首先要考虑 因为它可以使数据库的性能得到很大的提升
缺点
- 多占用磁盘空间
- 会减慢插入 修改和删除的效率
创建索引
使用 index 或者 key 随同表一起创建
创建常规索引 使用index创建常规索引 索引名称为u_index
mysql> create table test4( -> id int unsigned primary key auto_increment, -> username varchar(10), -> index u_index(username) -> );
使用key创建常规索引不起名称
mysql> create table test5( -> username varchar(10), -> key (username) -> );
说明:如果创建索引的时候给定了索引名称 则索引名为你给定的名称 否则为字段名
建表以后添加索引 ( 常规或唯一索引 )
create index 索引名称 on 表名(字段名)
create index username on test5(username);
删除索引
drop index username on test5;
drop index 索引名称 on 表名
注意
在给mysql创建唯一或者常规索引的时候 最好单占一行
一个表中可以存在多个索引 但是要根据具体需求设置索引 前提是某个字段有大量查询的时候
4、唯一索引
概述
唯一索引与主键索引一样 都可以防止创建重复的值 但是不同之处在于 每个表中只能有一个主键索引 但是可以有多个唯一索引
定义
unique 创建唯一索引
注意
如果你在给表中插入数据出现了报错 但是SQL语句还没有问题 那你就要查看一下 当前字段是否存在唯一索引
创建
创建唯一索引并起名称
mysql> create table test6( -> id int unsigned primary key auto_increment, -> username varchar(10), -> unique u_username(username) -> );
创建唯一索引不起名称(默认名称为字段名)
mysql> create table test7( -> id int unsigned primary key auto_increment, -> username varchar(10), -> unique(username) -> );
5、常规索引和唯一索引的区别
这俩个索引在查询能力上是没有区别的 如果考虑对于更新性能的影响 建议使用普通索引
mysql更新
普通索引:
将数据页从磁盘读出到内存更新数据页
唯一索引:
将数据页从磁盘读出到内存 判断是否唯一 再更新数据页
6、查看索引执行效率
创建表
mysql> create table test8( -> id int unsigned primary key auto_increment, -> username varchar(10), -> age tinyint default 18 -> );
写入数据
insert into test8 values(null, 'lucky', 18);
insert into test8(username, age) select username,age from test8;
开启mysql运行时间监控
set profiling = 1; [ˈproʊfaɪlɪŋ]
开启查询
select * from test8 where name='zhangsan'
删除索引
drop index username on test8;
查看时间
show profiles;