没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、索引
1
、
mysql
索引
按数据结构分【
B+tree
索引、
Hash
索引、
Full-Text
索引】
按物理引擎分【聚簇索引、二级索引】
按字段类型分【主键索引、唯一索引、普通索引、前缀索引】
按字段个数分【单列索引,联合索引】
B+Tree
是一种多叉树,叶子节点才存放数据,非叶子节点只存放索引,而且每个节点里的数据是按主键
顺序存放的。每一层父节点的索引值都会出现在下层子节点的索引值中,因此在叶子节点中,包括了所
有的索引值信息,并且每一个叶子节点都有两个指针,分别指向下一个叶子节点和上一个叶子节点,形
成一个双向链表。
InnoDB
存储引擎:
B+
树索引的叶子节点保存数据本身;
MyISAM
存储引擎:
B+
树索引的叶子节点保存数据的物理地址;
2
、索引失效
1.
对索引使用左或者左右模糊匹配
2.
对索引使用函数
但是在
8.0
之后加入了对函数计算后的索引
3.
对索引进行表达式计算
因为索引保存的是索引字段的原始值,而不是
id + 1
表达式计算后的值,所以无法走索引,只能通过把
索引字段的取值都取出来,然后依次进行表达式的计算来进行条件判断,因此采用的就是全表扫描的方
式。
4.
对索引进行隐式类型转换
如果索引字段是字符串类型(
varchar
),但是在条件查询中,输入的参数是整型(
int
)的话,你会在执
行计划的结果发现这条语句会走全表扫描。
但是如果索引字段是整型类型,查询条件中的输入参数即使字符串,是不会导致索引失效,还是可以走
索引扫描。
-- name 字段为二级索引
select * from t_user where name like '%xxx';
1
2
-- name 为二级索引
select * from t_user where length(name)=6;
1
2
alter table t_user add key idx_name_length ((length(name)));1
explain select * from t_user where id + 1 = 10;1
5.
联合索引没有遵循最左匹配原则
原因是,在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序。
也就是说,如果我们想使用联合索引中尽可能多的列,查询条件中的各个列必须是联合索引中从最左边
开始连续的列。如果我们仅仅按照第二列搜索,肯定无法走索引。
6.
where
语句中的
or
这法就是让另一个字段也为索引
==
3
、
count(*)
和
count(1)
和
count(
字段
)
哪个性能好
按照性能排序
count(*) = count(1) > count(
主键字段
) > count(
普通字段
)
count()
函数计算不为
null
的字段有多少个
这条语句是统计「
t_order
表中,
name
字段不为
NULL
的记录」有多少个。也就是说,如果某一条记
录中的
name
字段的值为
NULL
,则就不会被统计进去。
这条语句是统计「
t_order
表中,
1
这个表达式不为
NULL
的记录」有多少个。
1
这个表达式就是单纯数字,它永远都不是
NULL
,所以上面这条语句,其实是在统计
t_order
表中有多
少个记录。
count(
主键索引
)
的执行过程
1.
在通过
count
函数统计有多少个记录时,
MySQL
的
server
层会维护一个名叫
count
的变量。
2. server
层会循环向
InnoDB
读取一条记录,如果
count
函数指定的参数不为
NULL
,那么就会将变
量
count
加
1
,直到符合查询的全部记录被读完,就退出循环。最后将
count
变量的值发送给客户
端。
3. InnoDB
是通过
B+
树来保存记录的,根据索引的类型又分为聚簇索引和二级索引,它们区别在
于,聚簇索引的叶子节点存放的是实际数据,而二级索引的叶子节点存放的是主键值,而不是实际
数据。
如果只有主键索引(聚簇索引),那就是按照上面的方式,如果还有二级索引,就是叶子节点的数据区
存放的是主键
id
,这相对于聚簇索引来说是轻量级的,
innoDB
会优先选择使用二级索引,这样开销会更
小
count(1)
的执行过程
如果不含其他索引,只有主键索引
select * from t_user where id = 1 or age = 18;1
select count(name) from t_order;1
select count(1) from t_order;1
InnoDB
循环遍历聚簇索引(主键索引),将读取到的记录返回给
server
层,但是不会读取记录中的任
何字段的值,因为
count
函数的参数是
1
,不是字段,所以不需要读取记录中的字段值。参数
1
很明显
并不是
NULL
,因此
server
层每从
InnoDB
读取到一条记录,就将
count
变量加
1
。
可以看到,
count(1)
相比
count(
主键字段
)
少一个步骤,就是不需要读取记录中的字段值,所以通常会
说
count(1)
执行效率会比
count(
主键字段
)
高一点。
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no
performance difference.
count(
字段
)
走的是全表扫描
查看当前字段有没有
null
,不是
null
则计数
4
、优化
count(*)
针对于大数据
count(*)
耗时比较大的
第一种,近似值
使用
show table status
或者
explain
命令来表进行估算。
第二种,维护一张表记录数据个数
当我们在数据表插入一条记录的同时,将计数表中的计数字段
+ 1
。也就是说,在新增和删除操作时,我
们需要额外维护这个计数表。
二、事务
1
、事务的特性(
ACID
)
原子性
(
Atomicity
)
:要么都做,要么都不做
一致性
(
Consistency
)
:事务前后,要保持数据一致的状态,可以用化学的能量守恒来表达
隔离性
(
Isolation
)
:防止事务并发执行由于交叉导致数据不一致(数据库允许多个并发事务同时对
其数据进行读写和修改的能力)
持久性
(
Durability
)
:事务一旦提交,就不可修改
实现四种特性的具体表现
持久性是通过
redo log
(重做日志)来保证的;
原子性是通过
undo log
(回滚日志)
来保证的;
隔离性是通过
MVCC
(多版本并发控制)
或锁机制来保证的;
一致性则是通过持久性
+
原子性
+
隔离性来保证;
2
、并发事务引起的问题
脏读
如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。
不可重复读
同一个事务先后读取的数据不一致
幻读
多次查询某个符合条件的【个数】,但是出现了前后两次数据记录数量不一样的情况,就像出现了幻觉
一样
3
、事务隔离级别
(RU
、
RC
、
RR
、
S)
读未提交
(
read uncommitted
)
:一个事务还没提交,他执行的结果能被别人引用,会发生胀读、
不可重复读、幻读
读已提交
(
read committed
)
:一个事务提交之后,他修改的数据才能被别人看见,会发生不可重
复度、幻读,可以避免脏读
可重复度
(
repeatable read
)
:一个事务启动开始读的数据一直保持不变直到这个事务结束,会发
生幻读,避免了脏读、不可重复读
剩余17页未读,继续阅读
资源评论
老哥不老
- 粉丝: 280
- 资源: 153
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功