-
数据库锁
数据库有两种,悲观锁,乐观锁
悲观锁:数据更改时,将数据锁住,更改完成会释放,成为数据库锁机制。主要表锁,行锁,页锁。
乐观锁:修改完成准备提交才会将数据锁住,完成更改后释放 -
分区分表
什么是 mysql 分表和分区
就是把一张表分成 N 多个小表就是分表
分区呢就是把一张表的数据分成 N 多个区块,可以在同一个 磁盘上,也可以在不同的磁盘上
mysql 分表和分区有什么区别呢?
mysql 的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张 表,都对应三个文件,一个.MYD 数据文件,.MYI 索引文件,.frm 表结构文件。
数据处理上: 分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个 的分表里面。
提高性能上: 分表后,单表的并发能力提高了,磁盘 I/O 性能也提高了
.mysql 分表的三种方法:
做 mysql 集群, 预先估计会出现大数据量并且访问频繁的表, 利用 merge 存储引擎来实现分表
分区类型: range 分区, list 分区, hash 分区, key 分区
3,应该使用哪一种方式来实施数据库分库分表,这要
看数据库中数据量的瓶颈 所在,并综合项目的业务类型进
行考虑。
单库多表 : 随着用户数量的增加,user 表的数据量会越来越大,当数据量达到一定 程度的时 候对 user 表的查询会渐渐的变慢,从而影响整个 DB 的性能。
多库多表 :随着数据量增加也许单台 DB 的存储空间不够,随着查询量的增加单台数据 库服 务器已经没办法支撑。这个时候可以再对数据库进行水平区分。
4 mysql 读写分离
绝大部分情况都是读远大于写。Mysql 提供了读写分离 的机制,所有的写操作都必须对应到 Master,读操作可以在 Master 和 Slave 机 器上进行, Slave 与Master 的结构完全一样,一个 Master 可以有多个 Slave,甚 至 Slave 下还可以挂 Slave,通 过此方式可以有效的提高 DB 集群的每秒查询率.26 所有的写操作都是先在 Master 上操 作,然后同步更新到 Slave 上,所以 从 Master 同步到 Slave 机器有一定的延迟,当系统 很繁忙的时候,延迟问题会 更加严重,Slave 机器数量的增加也会使这个问题更加严重。
5 MySQLSQL 语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orderby 涉及 的列上建立索引。
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行 全表扫描。
3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用 索引而进行全表扫描.
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引 而进行全表扫描.
5.下面的查询也将导致全表扫描: selectidfromtwherenamelike’%abc%’ 若要提高效率,可以考虑全文检索。
6.in 和 notin 也要慎用,否则会导致全表扫描,如: selectidfromtwherenumin(1,2,3)
7.如果在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会 解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引 而进行全表扫描。
9.应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而 进行全表扫描.
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系 统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中 的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可 能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构.
13.很多时候用 exists 代替 in 是一个好的选择.
14.并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引 列有大量数据重复时,SQL 查询可能不会去利用索引.
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低 了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索 引需要慎重考虑,视具体情况而定.
6 数据库优化方案整理
优化分片键:
1.不要使用分区,分区性能很低,难以维护
2.不要使用主从数据库,读写分离有了缓存就再也不需要分主从了,毕竟延迟问 题是无法解决的
3如果使用分库分表,那么查询条件务必先走分片键,否则就成了全表查询,性
能超低
2、优化索引
(1)索引列务必重复度低
(2)使用索引就不能用 OR 查询,否则索引不起作用
(3)使用索引,like模糊查询不能以%开头
(4)查询条件务必以索引列开头,否则索引失效
(5)联合索引遵守最左原则
3、优化缓存 分离冷热数据,对于大内存访问评率低的数据适当分离
提高缓存命中率,命名问题
4、优化 sql
- 列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等
- 建立单列索引
- 根据需要建立多列联合索引
- 当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低
- 如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。
(1) 根据业务场景建立覆盖索引只查询业务需要的字段,如果这些字段被 索引覆盖,将极大的提高查询效率
(2) 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率
(3) where 条件字段上需要建立索引
(4) 排序字段上需要建立索引
(5) 分组字段上需要建立索引
(6) Where 条件上不要使用运算函数,以免索引失效