在mysql中,index是指“索引”,是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列;否则,数据库系统将读取每条记录的所有信息进行匹配。因此使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。
本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。
在mysql中,index是指“索引”,是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。
通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。
可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间。
因此,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。
为什么要使用索引
索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。
索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。
在 MySQL 中,通常有以下两种方式访问数据库表的行数据:
1) 顺序访问
顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。
2) 索引访问
索引访问是通过遍历索引来直接访问表中记录行的方式。
使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
例如,在学生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系统就建立了一张索引列到实际记录的映射表。当用户需要查找 student_id 为 12022 的数据的时候,系统先在 student_id 索引上找到该记录,然后通过映射表直接找到数据行,并且返回该行数据。因为扫描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。
简而言之,不使用索引,MySQL 就必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL 就能快速到达一个位置去搜索数据文件,而不必查看所有数据,这样将会节省很大一部分时间。
索引的优缺点
索引有其明显的优势,也有其不可避免的缺点。
优点
索引的优点如下:
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
可以给所有的 MySQL 列类型设置索引。
可以大大加快数据的查询速度,这是使用索引最主要的原因。
在实现数据的参考完整性方面可以加速表与表之间的连接。
在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
缺点
增加索引也有许多不利的方面,主要如下:
创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。
使用索引时,需要综合考虑索引的优点和缺点。
索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。
索引设计原则
1)要注意,索引也是要占用磁盘空间的,所以并不是越多越好。
2)过多的索引会影响INSERT,DELETE,UPDATE等语句的执行效率。
3)数据过少不建议建立索引。
4)对于唯一性约束,应使用对应的唯一性索引。
5)尽量不对区分度低的字段建立索引。例如:枚举类型的性别字段只有男女,起不到优化效果。
6)建议在创建表的时候创建索引。若表中有大量记录,那么将列建为索引后,表中所有记录都将会修改。
7)不经常查询的字段,不建议创建索引。
类型 | 作用 |
---|---|
普通索引 | 基本索引方式,无特别说明 |
唯一性索引 | 数据唯一,允许有null |
主键索引 | 表中只有一个主键,数据唯一,不允许有null |
复合索引 | 可以包含两个或多个列的索引方式 |
根据不同的环境选择对应的索引类型即可。
以普通索引为例,在创建表的时候创建索引
create table 表名( 字段定义… index 索引名称(字段));
以普通索引为例,将表修改为索引
alter table 表名 add index 索引名称(字段);
可以使用key代替index,并且索引名称可以省略,不加索引名默认以字段名作为索引名。
没啥要注意的,最基础的索引方式。
创建一个表,并且建立普通索引,索引列为id
mysql> create table test1(id int,name varchar(5),age tinyint,index index_id(id));
查看表结构,在key下的MUL就代表着普通索引
mysql> desc test1; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | YES | MUL | NULL | | | name | varchar(5) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+------------+------+-----+---------+-------+
查看索引信息
mysql> show index from test1\G *************************** 1. row *************************** Table: test1 Non_unique: 1 Key_name: index_id Seq_in_index: 1 Column_name: id Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: YES Expression: NULL 1 row in set (0.00 sec)
往表中添加一些数据,用于测试
mysql> insert into test1 values(1,'张三',21),(2,'李四',22),(3,'王五',23),(4,'赵六',24);
通过explain模拟执行sql查询语句,先不通过索引,查询姓名为赵六的记录。
mysql> explain select * from test1 where name='赵六'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test1 partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4 filtered: 25.00 Extra: Using where 1 row in set, 1 warning (0.00 sec)
type:ALL项表示全表扫描,rows: 4表示行数。因为赵六是表中最后一条记录,所以查询遍历了整张表。
接下来通过索引列id对姓名为赵六的字段进行查询。
mysql> explain select * from test1 where id=4\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test1 partitions: NULL type: ref possible_keys: index_id key: index_id key_len: 5 ref: const rows: 1 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)
rows: 1表示只检索了一行便将记录查找出来了,高下立判。
在唯一索引中,索引列中数据唯一,不能出现重复的值,用来约束内容,允许有null值。
语法:
create table 表名( 字段定义… unique key 索引名(字段名));
唯一索引常用在值不能重复的字段,身份证号,手机号等等。
创建一个表,并且建立唯一性索引,索引列为手机号。
mysql> create table test2(id int,name varchar(5),phone int,unique key unique_key_phone(phone));
查看表结构,key下为UNI的表示为唯一性索引
mysql> desc test2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(5) | YES | | NULL | | | phone | int(11) | YES | UNI | NULL | | +-------+------------+------+-----+---------+-------+
插入数据,并测试特性
mysql> insert into test2 values(1,'张三',1111111111); mysql> insert into test2 values(2,'李四',null); #可以为null mysql> insert into test2 values(3,'王五',1111111111); #值必须唯一 ERROR 1062 (23000): Duplicate entry '1111111111' for key 'unique_key_phone'
查看表数据
mysql> select * from test2; +------+--------+------------+ | id | name | phone | +------+--------+------------+ | 2 | 李四 | NULL | | 1 | 张三 | 1111111111 | +------+--------+------------+
主键索引也就是设置主键,每个表最多只能有一个主键。主键列值必须唯一,并且不允许有空值。
语法:
create table 表名(字段 primary key);
或者
create table 表名(
字段定义…
primary key 索引名称(字段));
创建一个表,并且设置为主键索引,索引列为id
mysql> create table test3(id int primary key,name varchar(5),age tinyint);
查看表结构,key下为PRI的为主键索引列
mysql> desc test3; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(5) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+------------+------+-----+---------+-------+
插入数据,并测试特性
mysql> insert into test3 values(1,'张三',23); mysql> insert into test3 values(null,'张三',23); #不能为null ERROR 1048 (23000): Column 'id' cannot be null mysql> insert into test3 values(1,'张三',23); #值不能重复 ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
查看表数据
mysql> select * from test3; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 张三 | 23 | +----+--------+------+
复合索引可以包含两个或多个列。
没有特定语法,可以为表创建双索引
创建一个表,并设置为复合主键,索引列为id,name
mysql> create table test4 (id int,name varchar(5),age tinyint,primary key(id,name));
复合主键特性和主键有些不同,只需要有一个字段不重复即可。
mysql> insert into test4 values(1,'张三',21); mysql> insert into test4 values(1,'李四',21); mysql> insert into test4 values(1,'张三',21); #主键列全重复 ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'
查看表数据
mysql> select * from test4; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 张三 | 21 | | 1 | 李四 | 21 | +----+--------+------+
【相关推荐:mysql视频教程】
以上是mysql index是什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!