常用数据库引擎 MyISAM 和 InnoDB的区别:
InnoDB 事务优先,对于每一条SQL语言都默认封装成事务并自动提交,支持外键,不保存表的具体行数,执行select count(*) 时需要全表扫描,适合高并发操作,行锁。
MyISAM 性能优先,不支持事务和外键,用变量保存整个表的行数,执行select count(*) 时读取该变量即可,表锁。
1.SQL 语句优化:
首先提出语句的解析过程:From .. On .. Join .. Where .. Group by .. Having .. Select Dinstinct .. Order by Limit ..
对查询进行优化,应尽量避免全表扫描。首先应考虑在 where 及 order by 涉及的列上建立索引,使用连接 JOIN 来代替 子查询,不使用NOT IN 和 <>,因为它们不会使用索引而选择进行全表扫描,可以用 NOT EXISTS 和 ID>3 OR ID<3 代替。
全表扫描:对无索引的表进行查询一般称为全表扫描。对给定一个值的条件查询时会扫描整个表该列所有的值。
2.索引优化:
索引相当字典的目录,索引是数据结构(默认为B树)。
如下图:数据表 student(id,name,age) 中 age 这一列在执行图中语句时,加与不加索引两种情况的区别,加上索引查询时根据结构B树,只需要3次即可找到,而不是全表扫描。
分类:主键索引(使用 primary key 时默认创建)、单值索引 index、唯一索引 unique(不能重复的列如ID,可以为空)、复合索引(多个列构成,也可以单列使用)
语法:CREATE 索引类型 索引名 on 表(字段)
举一个创建复合索引的例子:CREATE INDEX DEPT_NAME_INDEX ON TABLENAME(DEPT,NAME)
查询索引:SHOW INDEX FROM TABLE
什么情况下需要创建MySQL索引?
1、较频繁地作为查询条件的字段
2、唯一性太差的字段不适合建立索引,如状态字段、类型字段,那些只存储固定几个值的字段,有点像枚举
3、更新太频繁地字段不适合创建索引
4、不会出现在where条件中的字段不该建立索引
索引的弊端是什么?
不是所有场景适用(少量数据、频繁更新、很少使用的字段)、会降低增删改的效率(因为需要对索引进行更新,绝大部分操作是做查询)
3.读写分离:
简单说就是将原有数据库分为主、从两个数据库,让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
不一定都要读写分离,如果程序与数据库间更新少,查询多时考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。