mysql预处理的作用?
在一定程度上可以提高程序运行效率;
普通的SQL语句每次都需要经过词法和语义解析,优化SQL语句并制定执行计划,对于多次执行相同SQL语句的情况,MYSQL预处理省去解析优化过程,提高运行效率。
另外预处理可以防止客户端SQL注入。
自旋锁
不会放弃CPU时间片,而是通过自旋等待锁的释放,也就是说,它会不停的尝试获取锁,如果失败就再次尝试,直到成功。
让线程始终处于Runnable状态,节省线程状态切换带来的开销。
mysql事务隔离级别
读未提交
读已提交
可重复读 (mysql默认)
序列化
mysql主从复制的原理
- 主库必须开启二进制日志
- 当有增删改的语句时,会记录到主库的binlog日志中
- 主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)
- 从库的sql线程负责读取它的relay binlog里的信息并应用到数据库中。
explain执行计划
type: 本次查询表连接类型
key:最终选择的索引
key_len: 本次查询用于结果过滤的索引实际长度
rows: 预计需要扫描的记录数
extra: 额外附加信息
mysql分库分表
水平分库
以字段为依据,按照一定策略(hash, range等),将一个库中的数据拆分到多个库中。
垂直分库
以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。
mysql数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
- 设计良好的数据结构,允许部分数据冗余,尽量避免join查询,提高效率。
- 设计合适的表字段数据类型和存储引擎,适当的添加索引。
- mysql库主从读写分离。
- 找规律分表,减少单表中的数据量提高查询效率。
- 添加缓存机制。
- 书写高效率的sql。
锁的优化策略
- 读写分离
- 分段加锁
- 减少锁持有的时间
索引的底层实现原理
B+树
在所有的叶子节点增加了指向下一节点的指针。