mysql 性能优化
2020-03-31 14:18:59 0 举报
mysql 性能优化
作者其他创作
大纲/内容
key length
5
join buffer
join
4
阮书锦
2
user_id
max_length_for_sort_data
索引
order by
调整join buffer size
永远用小结果集驱动大的结果集
死锁: row-level
MYI
谢伟
1
索引结构
查询4次
是否创建索引
指针
7
所有数据全部去除 -> 排序字段+ 指针在sort buffer中排序(其他数据放在内存中) -> 指针到内存中取数据然后返回
以name为索引的B+Tree
加大max_length_for_sort_data 从而使用第二中排序方法(排序只针对需要排序的字段)
xx
23
通过在指向数据记录的第一个索引之前和最后索引建之后的空域空间上锁定信息来实现的
t2
create_date
B-Tree
table 1
以name为索引的索引树
table 3
有序
永远用小结果集驱动大结果集
xxxx
实现BerkeleyDB
隔离级别
result
排序占用空间
人员表
聚集索引
achievements
空间换时间
应用服务器
0x123
cons
总结
串行化(serializable)
内存
row-level
sort buffer
table1 update table where id =1
nested loop join
table2 update table where id = 4
尽可能避免复杂的jion和子查询
调整索引导致的计算量
page-level
查询1次
减少基于范围的数据是检索过滤条件
共享锁
数据库层面
排序字段和指针在sort buffer排序 -> 然后指针去取数据
select * from table where name = '李权兵'
实现: Innodb
t1
李权兵
select * from table where id = 4
storage engine layer
业务允许的情况下, 尽量使用较低级别的事务隔离
优化
IDB
已提交读(read committed)
hash
较频繁的作为查询条件的字段应该创建索引
pros
尽量控制事务的大小
吕伯文
实现: MyIsam
容易发生死锁
更新非常频繁的字段不适合创建索引
order by底层实现
实现逻辑简单
保证被驱动表上的join条件字段已经被索引
select * from t_user order by birthday asc limit 3;select * from t_msg where user_id = 1;select * from t_msg where user_id = 2;select * from t_msg where user_id = 3;
join 底层实现
id
粒度小
尽可能让所有的数据检索通过索引来完成
无序
介于row和table之间
唯一性太差的不适合单独创建索引
birthday
双路排序
锁
宏观层面
R-Tree
sort bufer
提高检索效率
增大sort_buffer_size, 减少在排序过程中进行数据分段
数据量
crons
索引顺序一致的话不需要再排序(B+Tree的特性)
mysql server
user
Innodb 和 MYISAM的索引
原则
锁资源
内存不足时去掉不必要的返回字段
间隙锁
select * from t_user order by birthday
table 2
降低排序成本
sql层面
name
MySql的事物隔离级别
排序分组主要消耗的是我们的cpu和内存资源
数据库
MYD
绩效表
获取,释放快
耗内存
更新索引的IO量
age
获取/释放工作量多
MYISAM
1.show full processlist;2. show slow sql3.explain
以ID为索引的B+Tree
种类
未提交读(read uncommitted)
实现
FullText
避免死锁
节省IO
Sql Layer
以主键为索引来组织数据
只取出自己需要的columns
3
example: 查询运营支撑组最年轻的三个员工的谁的话最多
非聚集索引
单路排序
可重复读(repeatable read)
锁优化
不会出现在where子句中的字段不适合创建索引
仅仅使用最有效的过滤条件
table-level
存储空间
合理设计索引
Innodb
性能影响因素-程序员面向对象
排它锁
0 条评论
下一页