一、什么是索引(index)?
- 数据库中的索引与书籍中的目录类似 在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码
- 数据库索引 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单
二、索引有什么作用?
- 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本(I相当于int存入insert,O相当于out输出select)
- 通过创建唯一性索引保证数据表数据的唯一性 ,可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间
三、索引的优缺点是什么?
- 优点 可以快速的找到所需要的的资源
- 缺点 占用空间 所以,相比来说小的数据库就无须建立索引,数据量超过300行的表应该有索引
四、索引的分类
- 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制
- 唯一性索引 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一 可以为空必须为1 只能空一次
- 主键 主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY 非空且唯一
- 全文索引 MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
- 单列索引与多列索引 索引可以是单列上创建的索引,也可以是在多列上创建的索引
- 主键key描述字段含义
PRI主键约束;
UNI唯一约束;
MUL可以重复。
五、创建索引有什么原则依据?
- 表的主键、外键必须有索引
- 数据量超过300行的表应该有索引
- 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁地字段不适合创建索引
- 经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建在选择性高的字段上
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
六、什么是外键?什么是候选键?
主表中的外键是另一张表的主键。 候选键:除了主键以外的都是候选键。 要想能快速查找某一条你想要的数据,必须要要创建主键(一般在开始创建表的时候就会设置)。
七、如何创建索引?
根据企业需求选择了合适的索引之后,可使用 create index创建索引
create index加上各个索引关键字便可创建各个类型的索引
1、创建普通索引
代码语言:javascript复制mysql> create index ttt on gousheng(name); '创建名为ttt的索引'
mysql> show index from gousheng G;
*************************** 5. row ***************************
Table: gousheng
Non_unique: 1
Key_name: ttt
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
5 rows in set (0.00 sec)
ERROR:
No query specified
mysql> describe gousheng; ' 查看表组成架构'
--------- ------------- ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
--------- ------------- ------ ----- --------- -------
| id | char(3) | NO | PRI | NULL | |
| name | char(10) | NO | MUL | NULL | |
| score | int(3) | YES | | NULL | |
| address | varchar(50) | YES | | baomi | |
--------- ------------- ------ ----- --------- -------
4 rows in set (0.00 sec)
2、创建唯一性索引
这里的唯一性 不是指一个字段只能建立一个索引 而是每一字段对应的必须是唯一的 可查找的 跟身份证一样的 唯一索引可以为空 且可以多个NULL空
代码语言:javascript复制mysql> create unique index hi on hello(name);
mysql> show index from helloG;
*************************** 1. row ***************************
Table: hello
Non_unique: 0
Key_name: hi
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
ERROR:
No query specified
3、创建主键索引
主键索引相当于unique not null 自动增长auto_ increment primary 在一个表只能出现一次
复合主键 就是说单独的一个字段可以相同 但两个加一起不能相同 两个共同作为主键
代码语言:javascript复制表school.service
host_ ip 主机IP
service_ name 服务名
port 服务对应的端口
allow(Y,N) 服务是否允许访问
主键: host_ jip port = primary key
mysql> create table service(
-> host ip varchar(15) not null,
-> service_ name varchar(10) not null,
-> port varchar(5) not null,
-> allow enum(Y,'N) default 'N',
-> primary key(host_ ip,port)
-> );
Query OK, 0 rows affected (0.00 sec)
代码语言:javascript复制mysql> alter table hello add primary key(id);
mysql> show index from helloG;
*************************** 1. row ***************************
Table: hello
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: score
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
4、创建全文索引
概念 通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。
你可能会说,用 like % 就可以实现模糊匹配了,为什么还要全文索引?like % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。
代码语言:javascript复制语法:
create fulltext index <索引的名字> on tablename(列的列表);
例如:
create fulltext index full_index_addr on IT_salary(addr);
'//全文索引:往往用于字符串,而不适用于数值类型'
5、查看索引
代码语言:javascript复制show index from tablenameG; 竖着去查看
show keys from tablename; 默认横着去查看
6、删除索引
代码语言:javascript复制MySQL [company]> drop index namel on department2; 删除名为namel的索引