mysql 索引
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
主键为默认索引,查询数据默认按照索引升序排列。无论插入顺序如何,一定会按照索引来排序查询(有序)。
索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大查询数据所花费的时间就越多。如果表中查询的列有索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
数据量少的或者经常需要更新的表就不需要用到索引。因为索引也是需要存储空间的
底层为单向链表结构。
扫描表就是最慢的一种方式
页目录保存的是索引。如果我查询 a < 3 ,我就会先在页目录里查询 4 以下的 ,查询到对应的页目录之后在查询响应下面的索引。就不会查询大于4 的数据。这就是索引快的原因
- 聚集索引:每个表只有一个聚集索引,那就是主键,聚集索引会把表中的每行数据存储到索引的叶子节点中。(就是跟图片一样,存储到1 后面,再分节点存储数据)。
- 普通索引: 新建索引都是普通索引,只有主键是聚集索引。普通索引保存的是行号,并不是保存的值。
- 覆盖索引 :当查询列表和索引列是一致的,就是覆盖索引。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VoSn9bNk-1609662059926)(C:\Users\Simple\AppData\Roaming\Typora\typora-user-images\1609043801248.png)]
解析顺序:
union all和union的区别 怎么使用 :
一、区别bai1:取结果的交集
1、union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序;
2、union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;
二、区别2:获取结果后的操作
1、union: 会对获取的结果进行排序操作
2、union all: 不会对获取的结果进行排序操作
使用要求:
(1)各个select查询语句中,各个select查询的列数的个数必须相同,不能1个select查询的列数是4列,而另一个select查询的列数是7列。
(2)各个select查询语句中,每个列的数据类型必须相同或相似。不能1个select的第1列是int类型,而另一个select的第1列是nvarchar类型。
组合索引:
创建组合索引
CREATE TABLE tab3(
id INT(4) NOT NULL,
name CHAR(20) NOT NULL,
age INT(3) NOT NULL,
info VARCHAR(255),
INDEX multiIdx(id,name,age)
);
使用组合索引要遵循最左前缀原则:
最左前缀:组合索引遵从了最左前缀,利用索引中最左边的列集来匹配行,这样的列集称为最左前缀。例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引组合中的字段可以是(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成最左面的前缀原则,那么就不会用索引,比如,age或者(name,age)组合就不会使用索引查询。
查看索引的使用信息:
EXPLAIN SELECT * FROM tab3 WHERE id = 1 AND name = 'nana';
查询结果如图:
在已经创建好的表里添加索引:
ALTER TABLE book ADD INDEX BkNameIdx(name(30));
B + 树结构图
B+ 树特点 :
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好
是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储
(关键字)数据的数据层;
4.更适合文件索引系统;
mysql优化
使用索引要注意的内容
-
尽量使用全职匹配(遵循左前缀法则)
-
不要对索引列做任何的操作(计算,函数,类型转换)
-
范围条件后索引失效
4.覆盖索引尽量使用
5.不等于要慎用
6.not null 对索引有影响
7.like 查询注意事项
以通配符开头索引会失效
8.字符类型的引号不能省去,会进行自动类型的转换,索引失效
9.尽量少使用 or ,用union 替代 or 查询
10.exit 替换in