1、MyISAM 与 InnoDB 的区别?
InnoDB:
事务型的存储引擎,有行级锁定和外键约束
可靠性高,要求事务、更新频繁
MyIASM:
默认存储引擎,不支持事务、外键,但是存储行数、索引和数据分开存储,读取效率高
更新很少、读取频繁、发亮需求统计行数的sql
对比项 | MyISAM | InnoDB |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 |
表锁,操作一条数据也会锁住整个表 不适合高并发的操作 |
行锁,操作时只锁住某一行,对其他行没有影响 适合高并发 |
缓存 | 只缓存索引,不缓存真实数据 | 缓存索引和真实数据,对内存要求较高 |
2. 事务的隔离级别:
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
3. Mysql 性能优化
1. 当只要一行数据的时候使用 limit 分页查询 :
查询到如果已知会得到一条数据,这种情况下加上limit 1,此时数据库引擎找到一条结果停止搜索,不需要继续查询
2. 根据需求选择数据库引擎:
MyISAM 适用于一些大量的查询的应用,不适合大量写功能的应用。
InnoDB适用于哪些需要事务支持的应用。
3. 用not exists 代替 not in :
not exists 用到了连接能够发挥已经建立好的索引的作用
not in 不能使用索引,所以要每条遍历比较,数据量大的情况下不建议使用 not in
4. 对操作符的优化,尽量不采用不利于索引的操作符:如
in
not in
is null
is not null
< >
5. 为常用的字段建立索引
6. 避免 select *
7. 读写分离,建立mysql集群,主从复制。读写分开
8. 索引优化,使用自增的字段作为主键
4. MySQL的触发器:
CREATE TRIGGER mytrigger -- 触发器名称,用户自定义
trigger_time --标识触发时机 BEFORE 或 AFTER
trigger_event ON tbl_name -- 标识触发事件 INSERT UPDATE DELETE tbl_name: 标识触发器建立的表名
FOR EACH ROW
trigger_stmt -- 触发体程序体,可以是一句SQL,或者 BEGIN 和 END 包含的多条语句