【mysql】相关
【mysql-索引】
21.6.12【索引的分类】
单列索引:索引加在一个列上
普通索引(normal):
alter table user add index `name`(`name`)
唯一索引(unique):
alter table user add unique index `code`(`code`);
主键索引(primary):
alter table user add primary key(`code`);
组合索引():
alter table user add index `id_name`(`id`,`name`);
全文索引(fulltext):
alter table user add fulltext index `code`(`code`);
空间索引(spatial):
21.6.12【索引的规则和使用】
哪些字段适合加索引:
【适合】
1.与其他表进行连接时,连接的字段应该建立索引
2.经常出现where中的字段,应该建立索引
【不适合】
1.频繁数据更改的表,不适合建立太多索引
2.索引应该建立在小字段上,大文本字段不适建立索引
不使用索引的情况:
1.若mysql估计扫全表比用索引更慢,则不用索引
2.or的前后没有同时使用索引,则不用索引
3.like 以%开始的,则不用索引
4.字段参与计算、函数的,则不用索引
5.隐式转换的则不用索引
6.不等于的字段不参与索引
7.复核字段不遵循最左原则的不用索引
1.同一个表不过度使用索引,10个字段有9个字段都加上了索引
2.聚簇索引(聚集索引):数据表存于B+树内,叶子节点存行记录数据,一般将自增ID作为聚簇索引
3.InnoDB是基于索引来完成行锁,若sql中没有索引,则会产生表锁;
4.select * from member where id=2 for update; 这就是读锁,也是行级锁,若id没有索引,则会锁member表
5.死锁是:多个事务再同一个资源上相互占用,请求锁定对方的资源
6.如何避免死锁:
1)同一个事务,尽可能一次锁定所需要的资源
2)对于易发生死锁的业务部分,可以采用表锁,再执行事务前检查是否锁了
3)使用乐观锁,
7.不用此表了用drop table 只清空数据不删表用truncate
8.count(*) 要比count(列名)更优
explain 详解:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
【优化mysql的思路】:
【创建数据表阶段】
1.字段not null设置,数据库不用比较null值
2.允许数据表冗余部分字段,减少join表的数量
3.添加查询索引
【再查询数据阶段】
1.使用join代替子查询
2.使用union代替临时表
3.少用like和通配符
4.explain下sql语句细致分析
【在架构阶段】
1.历史数据迁移至历史表,减少目标表的数据量
2.更换快速查询数据库(ck、es)
【锁】
乐观锁:操作数据的时候非常乐观,认为别人不会更改数据,只要在执行更新的时候判断以下即可,若是别人更改数据,则停止执行
悲观锁:操作数据的时候非常悲观,认为别人会更改数据,所以在一开始就锁住数据,等操作完了再释放锁
读锁:也叫共享锁 select * from member where id=1 for update;
写锁:也叫排他锁
【事务】
特性:
原子性:要么执行,要么不执行
一致性:事务内一至
隔离性:每个事务之间数据隔开
持久性:一旦提交,数据会永久写入磁盘
【隔离级别】
1.读取未提交:读取还未提交事务的数据,脏读
2.读取已提交:读取已经提交的数据,我还未提交,别人已经变更了数据 --不可重复、幻读
1)多个事务读取同一个事务,A事务修改数据,B事务也修改该数据 叫不可重复读的问题
3. 可重复读:对同一字段多次读取的结果都是一致的,除非本身事务修改,可以避免脏读和不可重复读,但是可能造成幻读
4.串行化:最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次执行,可以避免脏读、不可重复读、幻读
【binlog的录入格式】
statement:
row:
mixed:
浙公网安备 33010602011771号