小白篇(五):Mysql数据库进阶章-查询优化
01
—
Mysql运行顺序
Mysql语句执行顺序如下:
(1) from 查表
(3) join 关联表
(2) on 关联值
(4) where 筛选值
(5) group by 分组统计
(6) avg,sum.... 函数统计
(7) having 统计值过滤
(8) select 查询所需字段
(9) distinct 去除值
(10) order by 排序
(11) limit 获取指定条数
Mysql查询运行原理
小伙伴们可以从下图,了解到实际底层运行原理。我们通过一定的手段,优化其中某些节点位置。从而更高效的读取数据。
Mysql查询流程图
02
—
优化方向
如果最终的目的是更快的读取到数据。那么除了从Sql查询方面去下功夫优化,我们还可以从表结构,数据存储结构上去动动手脚哦。其实在面试过程中,很多人会问到Sql优化。那么我们不妨将问题看大点。整库的查询优化。那么可回答的点就多了。
一、数据库表结构设计
先遵循三大范式
一范式:原子性、不可拆分的字段属性
二范式:主外键约束关系
三范式:字段没有冗余(相关联表字段,不要重复出现在多个表中)
合理的数据存储,可以有效的减少需要查询的表,减少关联关系。
二、数据库索引设计
索引可以理解为给书添加目录.有了目录,定位内容就快了。
主键索引:
-- 表中作为唯一存在的键,值不能为空
ALTER TABLE table_name ADD PRIMARY KEY (字段);
唯一索引:
-- 表中可以存在多个唯一索引字段,允许一个空值.其它值不能为空且需唯一
ALTER TABLE table_name ADD UNIQUE [索引的名字] (字段);
单列索引:
-- 单列索引适合创建在值区分程度高的字段。时间和证件号这些合适。类型和性别字段不合适。因为区分程度太小了,还是会走全表扫描读取。
ALTER TABLE table_name ADD INDEX [索引的名字] (字段);
组合索引:
-- 如果在where中字段1和字段2同时出现.就会采用索引查询.即字段是组合出现的.
-- 当然如果只出现字段1也是可以走上索引的.如果只出现字段2就不行了.
-- 就类似2级目录一样.
ALTER TABLE table_name ADD INDEX [索引的名字] (字段1,字段2);
查看表中索引
show index from table_name ;
三、大表拆分(减少大表访问次数,控制IO和内容)
四、表定时整理,清理水位线
五、SQL语句调优
① 索引字段保持原汁原味(不要对索引字段做任何处理或运算)
-- date为索引字段,推荐
select 字段 from tab1 where date>='2020-10-01' and date<'2020-10-02'; -- 查询10月1号数据
-- 不推荐,索引被破坏
select 字段 from tab1 where substring(date,1,10)='2020-10-01';-- -- 查询10月1号数据
② union all 代替 or(增加sql代码量,换来高效运算率.有舍有得)
-- 推荐
select 字段 from tab1 where name ='a'
union all
select 字段 from tab1 where name ='b'
-- 不推荐
select 字段 from tab1 where name = 'a' or name = 'b'
③ 在数据不重复的情况下,用union all 代替union
④ 尽量减少不必要的排序
⑤ 利用limit 1取得唯一行
select 字段 from tab1 limit 1; -- 确认返回只有1条数据情况下
⑥ 避免Select * 命令,精准查询需要的字段.减少数据对内存的占用
-- 推荐
select 字段 from tab1
-- 不推荐,如果有大字段,哭去吧
select * from tab1
⑦ 尽量用上索引,加快查询性能.(索引不要盲目创建)
⑧ 减少表的访问次数,减少IO读写.(如果大表被重复使用,可处理成临时的小表再查询)
⑨ 多练习,多测试,多验证
03
—
小结