mysql索引与类型
什么是索引?
索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是B树结构组织的索引(B+Tree索引)。
索引类型:
索引名称 | 描述 |
---|---|
主键索引 | 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引 |
唯一索引 | 与普通索引类似,不同的是:索引列的值必须唯一,但是允许为空值。如果是组合索引,则列值的组合必须唯一 |
单索引 | 单个字段建立索引 |
联合索引 | 多个字段建立的索引,与单索引可统称为普通索引 |
全文索引 | FULLTEXT索引用于全文搜索。只有InnoDB和MyISAM存储引擎支持FULLTEXT索引和仅适用于CHAR,VARCHAR和TEXT列。 |
覆盖索引 | 只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 |
innoDB不支持hash索引。
主键索引:
创建主键索引语法:
ALTER TABLE"表名" ADD PRIMARY KEY (字段
);
例子:
alter table user
add primary key (id
);
唯一索引:
创建唯一索引语法:
CREATE UNIQUE INDEX 索引名 ON 表名
(字段名
)
例子:
create unique index idx_email on user(email);
普通索引:
创建普通索引语法:
ALTER TABLE 表名
ADD INDEX 索引名(字段
)
例子:
alter table user
add index idx_name(name); --单索引
alter table user
ADD index idx_age_sex(age,sex); --联合索引
覆盖索引与全文索引
什么是覆盖索引:
mysql官网表达意思:
只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
概念:
索引覆盖:是通过普通索引查询的时候,不需要回表查询,直接可以获取到对应的数据
全文搜索索引:
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键字词的频繁以及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
根据名称创建全文索引:
alter table `user` add FULLTEXT index namefulltext(`name`) WITH parser ngram;
select * from `user` where match(`name`) against('化');
全文搜索索引:
id | title | content |
---|---|---|
1 | php书籍 | 变量基础语法字符串数组面向对象核心扩展等 |
2 | mysql书籍 | 索引事务单表多表查询集群主从分库分表 |
3 | redis书籍 | 字符串类型队列有序集合zset类型还有stream类型 |
4 | laravel书籍 | 控制器模型数据库数组视图事件队列 |
5 | nginx书籍 | 高可用负载均衡反向代理配置解析 |
6 | swoole书籍 | swoole的http服务,tcp定时器 |
7 | thinkphp书籍 | 控制器模型数据库数组视图事件队列 |
全文搜索尽量使用搜索引擎
搜索引擎:es => 大型网站
轻量级搜索引擎:Sphinx =>开销比较小
mysql索引与数据存储的区别:
myisam存储引擎索引:
MYD
MYI
一个存储数据 一个存储索引:分开进行存储。
innodb存储引擎索引:
.ibd => 索引与数据存储 在一个文件中
ascii a 97 b 98
A 65 B 66
总结:
myisam:myisam存储 引擎的普通索引与主键索引在索引指向方面都是指定位实际的数据在磁盘中的位置。
innodb:innodb存储引擎的普通索引与主键索引在索引指定当面是普通索引指定主键索引的数据以及索引相关字段数据在磁盘中的位置,主键索引指向的是数据在磁盘中实际的位置。