七年mysql工作经验的总结 欢迎大佬补充、指正

使用mysql的最终目的是:高性能【高并发应该也属于高性能的范畴】 暂不考虑高可用。

1:表的设计

高性能的基石应该是合理的数据库设计,包括表的设计、字段的设计。

表的设计包括:合理的存储引擎选择、三范式与反三范式的酌情取舍。

字段数据类型的选择原则:再满足需求的同时选择占用空间少的数据类型,这样一条数据占用的空间就会减少,
mysql是以页为单位进行数据IO的,每页的大小为16KB,单条数据空间小,每页能够存放数据条数增多,间接的一次IO干的活增多。

mysql 主要数据类型:数字类型、字符串类型、时间类型。数字类型的数字和字符串类型的数字  有一个隐式的转换过程,对索引不友好

2:存储引擎主要选择 MyISAM存储引擎和InnoDB存储引擎

2.1:MyISAM存储引擎

不支持事务
不支持外键
不支持崩溃后的安全恢复

表级锁 读写相互阻塞 读读不阻塞 表级锁成本低
支持全文索引

支持索引压缩:假如索引页中存有1位置是abc和3位置abcd 则3位置的key会优化为1+d。索引压缩 会使页内数据提高,使缓存可以
处理更多数据,提高查询效率。

支持延迟更新索引 单线程下写速度快

MyISAM更适合读密集的表

MyISAM表存储的三种格式:

静态表:默认存储格式,表中的字段都是非变长字段 通过添加空格将所有字段设置指定长度[字段定义长度] 取出时再去除。
优点:容易缓存,存储速度快。缺点:占用空间多。

动态表:存储长度为实际存储内容的长度。优点:占用空间小。 缺点:频繁更新和删除数据时产生大量的碎片。

压缩表:将数据压缩,一般会压缩40%-70%。读取找到数据缓存到内存中 性能提升。缺点:压缩后不能更新 只读。


2.2:InnoDB存储引擎:

支持事务
支持外键
行级锁

支持事务:

A:原子性 C:一致性  原子性和一致性是由undo_logs实现。并显现了MVVC[多版本并发控制]。undo log存储在存储引擎所在目录可以设置innodb_undo_directory指定位置
innodb有undo segment管理undo 日志 一个undo segment可以管理1024个undo log。通过innodb_undo_logs可以查看有多少个undo segment 就可以支持N*1024个线程进行undo log
事务提交之后 undo log 不会立刻删除 而是放入一个链表中 等待判断是否有其他事务使用到。如果没有 才会删除。这样当执行一条删除语句时并不会立刻删除掉数据 而是将当前数据
设置为1 表示已删除的数据 当确定确实没有其他事务使用当前事务才会真正删除掉当前数据。


I:隔离性 Lock控制 MVVC多版本并发控制 保证事务的隔离性

读未提交:出现脏读

读已提交:出现不可重复读

可重复读:出现幻读

序列化:

D:持久化 通过redo_log实现。重做日志记录的事数据页的变化,可能一次事务中会有多个数据页变化,同样也会产生多个redo日志记录,是对事务的行为记录
每次修改或插入数据redo缓存都会写入文件缓存中,并在写入后调用fsync将缓存刷入到redo日志文件中。此时
innodb_flush_log_at_trx_commit 值为1; 当值为0时表示 事务提交时 redo缓存中的数据不会写入redo log文件,也不会写入redo log文件缓存,
写入工作 由master thread每隔1s时间调用一次fsync操作;当值2时表示 所有修改和插入数据只会从redo缓存写入到文件内存中,不会进行持久化,
当系统崩溃时就会丢失数据。

查看innodb_flush_log_at_trx_commit: show VARIABLES LIKE 'innodb_flush_log_at_trx_commit’;
设置innodb_flush_log_at_trx_commit: SET GLOBAL innodb_flush_log_at_trx_commit=0;


mysql中的锁

共享锁:共享锁只和共享锁 互容
排他锁:排他锁和任何锁都不容
意向共享锁:意向锁和意向锁都互容 不论共享和排他。
意向排他锁:意向排他锁和共享锁不容

表锁:
行锁:也叫记录锁,其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。
页锁:
间隙锁:必须在可重复读级别下,检索条件必须有索引。

排他锁包括行锁中的X锁和间隙锁

如何查看当先mysql数据库实例的隔离级别?

show variables like 'transaction_isolation';

设置隔离级别
set global transaction_isolation = 'read-committed';
重新打开窗口 相当于刷新session;

唯一索引为什么会比普通索引性能好?

唯一索引回表后不需要再去索引页中判断是否还有匹配的数据。


匹配索引?

如果数据的部分数据区分度大 [如前五个字节] 则可以通过字段的前五位进行创建一个索引,以提高查询效率,组要是缩短了索引的
长度,每页可以容纳更多的索引,提高了一次IO效率。注:索引部分的长度不能超过字段定义的长度,即使是会自动扩容的varchar也不行。


更新cardinality命令?

analyze table tablename;


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值