一直以来对于MySQL来说懵懵懂懂,SQL优化也是一个大问题,而每次面试面试官都喜欢问类似的问题,
结合以往的经验,对于SQL的性能优化整理一些粗浅的知识,当做笔记,也可以给初学者一个初步认识,
如果有误,请及时指出,加以修正。

1、搜索引擎

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB等等一系列,每种存储引擎有各自的优缺点
而工作中经常使用的就是MyISAM、InnoDB两种,默认存储引擎便是MyISAM

InnoDB和MyISAM的比较

MyISAM

优点:查询数据相对较快,适合大量的select,可以全文索引。
缺点:不支持事务,不支持外键,并发量较小,不适合大量update

InnoDB

优点:支持事务,支持外键,并发量较大,适合大量update
缺点:查询数据相对较快,不适合大量的select

2、索引

如果在你的表中,有某个字段你总要会经常用来做搜索,就必须为其加索引,已提高效率

UNIQUE唯一索引
不可以出现相同的值,可以有NULL值。

INDEX普通索引
允许出现相同的索引内容。

PRIMARY KEY主键索引
不允许出现相同的值,且不能为NULL值,一个表只能有一个primary_key索引。

fulltext index 全文索引
没怎么用过,效率有待商榷

3、字段类型

一定要为字段选择合适的类型,已char、varchar、text为例

char 定长,长度范围是0~255,当存储不够长时,MYSQL会将字段填充,过长则尾部被截,
适合存储一些固定长度的信息如身份证号码等信息
varchar 最多能存储65535个字节的数据
text 不可以有默认值,其最大长度是65535字节

从检索效率来说:char > varchar > text,所以能不用text,尽量少用

数字类型 decimal tinyint

tinyint 存储一些类型等等
decimal 适合存储金额

4、NOT NULL

一个字段除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL,会
提高检索效率

5、如果数据量特别大,可以读写分离,分表来提高效率

6、外键约束

外键约束,个人觉得主要是保持数据的完整性和一致性,但是工作中基本没有使用过,完全可以在
代码层面实现,而且在应用层面做数据的一致性检查,本来就是一个正常的功能需求,所以没有必要,
外键是对检索性能没有提升,反而会下降,在实际应用场景不建议使用外键

7、应用层面

避免select *
查询一条数据时,加上limi 1
基于索引去查询
减少链表查询(一些公司其实是禁止使用链表查询的),放在应用层去做
不要在循环中执行插入修改语句,多条插入生成一条SQL语句执行
随机获取数据不要rand()

LIKE

说一下LIKE,经常会使用到的模糊查询

like keyword% 索引有效
like %keyword 索引失效,使用全表扫描
like %keyword% 索引失效,使用全表扫描

所以在诗句的场景中要使用其他办法,比如一个场景:用户提供订单号往往是最后几位,这样去做查询,
是无法使用到索引的,其实就可以在表中多加一个字段,存储订单号的倒序,查询时基于这个字段查询就
可以使用到索引