mysql dml语句 先读取在更新_mysql优化二

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

减少数据访问:设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO

返回更少的数据:只返回需要的字段和数据分页处理 减少磁盘io及网络io

减少交互次数:批量DML操作,函数存储等减少数据连接次数

减少服务器CPU开销:尽量减少数据库排序操作以及全表查询,减少cpu 内存占用

利用更多资源:使用表分区,可以增加并行操作,更大限度利用cpu资源

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

最大化利用索引;

尽可能避免全表扫描;

减少无效数据的查询;

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

SELECT语句 - 语法顺序:

1. SELECT

2. DISTINCT 

3. FROM 

4.  JOIN 

5. ON 

6. WHERE 

7. GROUP BY 

8. HAVING 

9. ORDER BY 

10. LIMIT 

SELECT语句 - 执行顺序:

FROM

# 选取表,将多个表数据通过笛卡尔积变成一个表。

ON

# 对笛卡尔积的虚表进行筛选

JOIN

# 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中

WHERE

# 对上述虚表进行筛选

GROUP BY

# 分组

# 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的

HAVING

# 对分组后的结果进行聚合筛选

SELECT

# 返回的单列必须在group by子句中,聚合函数除外

DISTINCT

# 数据除重

ORDER BY

# 排序

LIMIT

SQL优化策略

一、避免不走索引的场景(针对5.7版本的mysql)

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

SELECT * FROM t WHERE username LIKE '%陈%'

优化方式:尽量在字段后面使用模糊查询。如下:

SELECT * FROM t WHERE username LIKE '陈%'

如果需求是要在前面使用模糊查询,

使用MySQL内置函数INSTR(str,substr) 来匹配,作用类似于java中的indexOf(),查询字符串出现的角标位置,不走索引但是性能更高。

使用FullText全文索引,用match against 检索

数据量较大的情况,建议引用ElasticSearch、solr,亿级数据量检索速度秒级

当表数据量较少(几千条儿那种),别整花里胡哨的,直接用like '%xx%'。

2. 尽量避免使用in 和not in,会导致引擎走全表扫描。如下:

SELECT * FROM t WHERE id IN (2,3)

优化方式:如果是连续数值,可以用between代替。如下:

SELECT * FROM t WHERE id BETWEEN 2 AND 3

如果是子查询,可以用exists代替。如下:

-- 不走索引

select * from A where A.id in (select id from B);

-- 走索引

select * from A where exists (select * from B where B.id = A.id);

3. 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE id = 1 OR id = 3

优化方式:可以用union代替or。如下:

SELECT * FROM t WHERE id = 1

UNION

SELECT * FROM t WHERE id = 3

4. 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHER

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值