SQL优化的⼀些策略(整理篇)
SQL优化的⼀些策略
定位SQL
当我们数据量⼤的时候,我们的SQL执⾏效率往往不是那么可观,虽然结果也执⾏的出来
SQL也是正确的,但是有的时候我们不得不更改原来的SQL以提升性能。
就像排序算法⼀样,逻辑简单的冒泡也能实现功能,但是数据量⼤的时候执⾏效率就⾮常
fileexists怎么解决的差,⽽我们的快速排序可以出⾊的解决我们的需求。
mysql语句的执行顺序show status
show status命令可以查看我们数据库的⼀些参数,⽐如如图所⽰,前四个Com是近期各类查询语句的执⾏次数,对于批量查询这个计数只会增加1,是对于任何的存储引擎都显⽰。
后⾯四个是InnoDB存储引擎的增删改查的SQL执⾏情况,记录的是影响的⾏数。
我们可以通过这些数据来分析,最近的SQL是哪些语句执⾏的⽐较多。举个例⼦,如果⼀个读多写少的数据表,我们更多的考虑是读的操作的SQL是否需要优化。
慢查询⽇志
除了上述的⽅式,我们可以开启慢查询⽇志,默认情况下是关闭的。
还有我们的慢查询⽇志⼀般默认在mysql根⽬录下的data⽂件夹下,⾥⾯记录了执⾏⽐较慢的SQL的信息。
如图,我们使⽤慢查询⽇志定位到了SQL的信息,⽐如执⾏时间是17秒,SQL是⼀个单表的查询语句,因上锁等待的时间是0秒等等,通过信息有利于我们进⾏问题的排查
除了查看慢查询⽇志的⽅式以外,MySQL提供了⼀种查询⽅法⾃动帮我们查询执⾏较慢的SQL。
使⽤:mysqldumpslow -t n ⽇志⽂件地址 可以⾃动帮我寻指定⽇志⽂件中,执⾏速度最慢的n条SQL
如果某些SQL查询的慢,但是⼤部分情况下是好的那么可以先不考虑优化。
如果某些SQL出现的频率⾮常的⾼,那么这些SQL就是我们要排查的需要优化的SQL。
SQL优化
对于经常被where条件关联的字段可以添加索引,如图所⽰,输了主键外,我还为name字段添加了索引,我们对主键,nam和email 三个字段分别进⾏⼀个等值查询,可以看到没有添加索引的字段执⾏效率⾮常的低下。
如果⼀个字段频繁被查询到,可以考虑添加索引。
注意!对于 or ⼦句,如果要利⽤索引,则or 之间的每个条件列都必须⽤到索引;如果没有索引,则应该考虑增加索引。
对于已经添加过索引的字段,如果指向效率⾮常低下,我们可以使⽤explain指令查看SQL的执⾏计划: explain [SQL语句] /G 如图,同样是like语句查询姓名,如果把%通配符写在后⾯不影响索引的使⽤,写在前⾯则索引失效。explain语句可以分析SQL的执⾏计划,以此来帮助我们排查问题。
学java去哪个论坛好优化 insert 语句
对于 Innodb 类型的表,我们有以下⼏种⽅式可以提⾼insert插⼊数据的效率的效率:
a. 因为 Innodb 类型的表是按照主键的顺序保存的,所以将导⼊的数据按照主键的顺序排列,可以有效的提⾼导⼊数据的效率。如果
Innodb 表没有主键,那么系统会默认创建⼀个内部列作为主键,所以如果可以给表创建⼀个主键,将可以利⽤这个优势提⾼导⼊数据的效率。
b. 在导⼊数据前执⾏ SET UNIQUE_CHECKS=0,关闭唯⼀性校验,在导⼊结束后执⾏ SETUNIQUE_CHECKS=1,恢复唯⼀性校
验,可以提⾼导⼊的效率。
c. 如果应⽤使⽤⾃动提交的⽅式,建议在导⼊前执⾏ SET AUTOCOMMIT=0,关闭⾃动提交,导⼊结束后再执⾏ SET
AUTOCOMMIT=1,打开⾃动提交,也可以提⾼导⼊的效率。
免费个人网站服务如果你同时从同⼀客户插⼊很多⾏,使⽤多个值表的 INSERT 语句。这⽐使⽤分开INSERT 语句快(在⼀些情况中⼏倍)。Insert into test values(1,2),(1,3),(1,4)…
使⽤ create temporary table 语法,它是基于 session 的表,表的数据保存在内存⾥⾯,当 session 断掉后,表⾃然消除。对于⼤表的统计分析,如果统计的数据量不⼤,利⽤ insert … select 将数据移到临时表中⽐直接在⼤表上做统计要效率更⾼。
优化 group by 语句
默认情况下,MySQL 排序所有 GROUP BY col1,col2,…。查询的⽅法如同在查询中指定 ORDER BY col1,col2,…。如果⼀条查询语句中包括 GROUP BY 但你想要避免排序结果的消耗,你可以指定 ORDER BY NULL禁⽌排序。例如:ibatis 去掉null
INSERT INTO foo SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
优化 order by语句
在某些情况中,MySQL 可以使⽤⼀个索引来满⾜ ORDER BY ⼦句,⽽不需要额外的排序。where 条件和 order by 使⽤相同的索引,并且 order by 的顺序和索引顺序相同 ,并且 order by 的字段都是升序或者都是降序。
例如:下列 sql 可以使⽤索引。
SELECT * FROM t1 ORDER BY key_part1,key_part2,… ;
SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
但是以下情况不使⽤索引:
order by 的字段混合 ASC和 DESC:vs2017安装教程unity
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
⽤于查询⾏的关键字与 ORDER BY 中所使⽤的不相同
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
数据库的优化策略
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论