SQL优化

优化成本:硬件>系统配置>数据库表结构>SQL 及索引。

优化效果:硬件<系统配置<数据库表结构<SQL 及索引。

对于MySQL层优化我一般遵从五个原则:

* 

减少数据访问:设置合理的字段类型,启用压缩,通过索引访问等减少磁盘 IO。
*
返回更少的数据:只返回需要的字段和数据分页处理,减少磁盘 IO 及网络 IO。
*
减少交互次数:批量 DML 操作,函数存储等减少数据连接次数。
*
减少服务器 CPU 开销:尽量减少数据库排序操作以及全表查询,减少 CPU 内存占用。
*
利用更多资源:使用表分区,可以增加并行操作,更大限度利用 CPU 资源。

总结到 SQL 优化中,就如下三点:

* 

最大化利用索引。
*
尽可能避免全表扫描。
*
减少无效数据的查询。

理解 SQL 优化原理 ,首先要搞清楚 SQL 执行顺序。

SELECT 语句,语法顺序如下:

1.SELECT
2.DISTINCT <select_list>
3.FROM <left_table>
4.<join_type> JOIN <right_table>
5.ON <join_condition>
6.WHERE <where_condition>
7.GROUP BY <group_by_list>
8.HAVING <having_condition>
9.ORDER BY <order_by_condition>
10.LIMIT <limit_number>

SELECT 语句,执行顺序如下:

FROM
<表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。
ON
<筛选条件> # 对笛卡尔积的虚表进行筛选
JOIN <join, left join, right join…>
<join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
WHERE
<where条件> # 对上述虚表进行筛选
GROUP BY
<分组条件> # 分组
<SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
HAVING
<分组筛选> # 对分组后的结果进行聚合筛选
SELECT
<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
DISTINCT

数据除重

ORDER BY
<排序条件> # 排序
LIMIT
<行数限制>

以下 SQL 优化策略适用于数据量较大的场景下,如果数据量较小,没必要以此为准,以免画蛇添足。
1.避免不走索引的场景

①尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描

②尽量避免使用 in 和 not in,会导致引擎走全表扫描

③尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描

④尽量避免进行 null 值的判断,会导致数据库引擎放弃索引进行全表扫描

⑤尽量避免在 where 条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描

⑥当数据量大时,避免使用 where 1=1 的条件

⑦查询条件不能用 <> 或者 !=

⑧where 条件仅包含复合索引非前置列

⑨隐式类型转换造成不使用索引

⑩order by 条件要与 where 中条件一致,否则 order by 不会利用索引进行排序

⑪正确使用 hint 优化语句

2.SELECT 语句其他优化

①避免出现 select *

②避免出现不确定结果的函数

③多表关联查询时,小表在前,大表在后

④使用表的别名

⑤用 where 字句替换 HAVING 字句

⑥调整 Where 字句中的连接顺序

3.增删改 DML 语句优化

①大批量插入数据

②适当使用 commit

③避免重复查询更新的数据

④查询优先还是更新(insert、update、delete)优先

4.查询条件优化

①对于复杂的查询,可以使用中间临时表暂存数据

②优化 group by 语句

③优化 join 语句

④优化 union 查询

⑤拆分复杂 SQL 为多个小 SQL,避免大事务

⑥使用 truncate 代替 delete

⑦使用合理的分页方式以提高分页效率

5.建表优化

①在表中建立索引,优先考虑 where、order by 使用到的字段。

②尽量使用数字型字段(如性别,男:1 女:2),若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

③查询数据量大的表 会造成查询缓慢。主要的原因是扫描行数过多。这个时候可以通过程序,分段分页进行查询,循环遍历,将结果合并处理进行展示。

④用 varchar/nvarchar 代替 char/nchar。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值