数据类型:数值、时间、字符串、枚举。
int(11):11还是其他都不会影响int的范围,只是前面填充0到11位。
删除了数据之后自增主键:innodb内存中会保留最大id,所以还是会以最大id+1作为主键,但是重启mysql之后内存清了,就会重新计算当前最大id+1。MyISAM则把最大id储存在文件中,重启也还在。
select count(1)和select count(*):实际无区别。表没有主键那么count(1)更快,有主键的话count(主键)最快。count(*)找表a中最短的列进行统计行数,如果一个表用count(*)比较多,考虑在一个最短的列建立一个单列索引,会极大的提升性能。count(col)不包括NULL字段统计。
优化方向:数据库表设计,良好的SQL、分库分表,主从读写分离、缓存、搜索引擎、硬件升级、索引使用、系统配置。
SQL调优:
第一范式是字段最小不可拆解,第二范式是字段和主键关联依赖,第三范式是字段和主键无间接关联(传递依赖)无冗余。
索引类型:普通索引、唯一索引、主键索引、外键索引、组合索引、全文索引。
MVCC 一词代表的是多版本并发控制,只在READ COMMITED和REPEATABLE READ两个隔离级别下工作。
mysql存储引擎
mysql索引 :有Hash索引(单个查询)、BTree索引,全文索引(full text)。
数据库事务
ACID:原子性、一致性、隔离性、持久性
原子性:要么全部执行成功,要么都不行执行,MVCC记录版本允许回滚。
一致性:事务开始和结束之间的中间状态不会被其他事务看到。
隔离性:事务不会被其他事务干扰。
持久性:每一次事务提交后就会保证不会丢失。
导致问题,1.脏读(读到别的事务尚未提交的数据),2.丢失修改(当一个事务修改是,另一个事务也在修改覆盖,导致前面事务修改丢失),3.不可重复读(两次读的数据不一致),4.幻读(读着的数据行数变化)
SQL标准定义四个隔离级别:
- READ-UNCOMMITTED(读取未提交),允许读取尚未提交的数据。导致脏读,幻读,不可重复读
- READ-COMMITTED(读取已提交),允许读取并发事务已经提交的数据,还会幻读,不可重复读
- REPEATABLE-READ(可重复读),对同一个字段多次读取结果完全一致除非自己改,还会幻读
- SERIALIZABLE(可串行化),最高隔离级别,完全ACID隔离,一个个事务依次执行
mysql默认的是可重复读,使用next-key lock锁算法避免幻读。
InnoDB存储引擎锁算法:record lock(行锁)、Gap lock(间隙锁,锁一个范围,不包括记录本身,这也是被锁对象不存在的时候),Next-key lock(record+gap锁定一个范围,包括记录本身)
死锁原因:互斥条件(某一时间独占资源)、请求和保持(已获取的资源不释放)、不可剥夺(已获取的资源,不能强行剥夺)、循环等待。
降低死锁:超时释放、顺序访问、避免事务干扰、事务简单、降低隔离级别、资源一次获取否则都释放。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。