一.sq优化方案:先看查询日志找到慢sql,再explain定位慢在哪个地方,再去加索引优化(一般sql优化首先考虑增加索引)
explain select * from cyh where id = 100; --分析慢sql
{
select_type : simple (简单查询,单表查询) ,primary(主查询),union(联合查询),subquery(子查询)
type: 连接类型。性能有好到差(system:表仅一行)(const:只有一行匹配)(ref:没有使用主键或唯一索引)(range:范围查询)(all:全表扫描)
possible_keys:null(可能索引)
key:null(命中的索引)
ref:
rows:8 扫描行数
}
alter table cyh add index cyh_sy(name)
alter table cyh drop index cyh_sy
二.常用sql语句预防点:
(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3)避免在索引列上使用计算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
(6)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
(7)尽量避免使用like语句时,匹配的起始位置用%,这将导致引擎放弃使用索引而进行全表扫描
(8)where 条件中的‘or’和‘and’连接时,要么都加索引要么都不加索引
(9) 避免隐式类型转换: where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。
三.Mysql 的存储引擎,myisam和innodb的区别:
事务 外键 锁 优点 缺点 存储结构
MyISAM: 不支持事务 不支持外键(关联的父子表) 只支持表级锁 查询贼快 由于只支持表级锁,也造成不能处理高并发的情况 索引和数据分开存储(.myd ; .myi)
innodb : 支持事物 支持外键 支持表级锁也支持行级锁 支持高并发 查询不够优化 索引和数据存储在一起(.ibd)
是非事务的存储引擎;适合用于频繁查询的应用(查询效率要由于innodb);表锁,不会出现死锁;适合小数据,小并发;不支持外键(关联父子表)
是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发;支持外键。
解释相关名词:
事务:绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
事务扩展のACID:
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。(简述:要么全做要么全不做)
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。(简述:能量守恒,不管你要怎样,你总得保存状态守恒)
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。(简述:类似锁,当这个事务占用这组数据就不允许其他事务干扰)
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。(简述:就是持久化存储)
事务扩展の隔离等级:数字越大隔离等级越高
1.Read uncommitted:读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。(脏读,我查询到了一个可能不是正确的数据)
2.Read committed:读提交,就是一个事务要等另一个事务提交后才能读取数据。(解决脏读的问题,但是不能重复读:假如一个事务,两种查询返回不同结果,查询的同时另一个在update)
3.Repeatable read:重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。(解决不可重复读,但是会出现幻读,查询的同时另一个在insert)
4.Serializable :是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。(解决幻读)
数据库锁:锁包括行级锁和表级锁
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。