sql语句能进行数据的操纵以及数据的定义,能够为用户带来极大的方便。本文会提到 52 条 SQL 语句性能优化策略。有需要的小伙伴,建议收藏。
|
sql语句能进行数据的操纵以及数据的定义,能够为用户带来极大的方便。本文会提到 52 条 SQL 语句性能优化策略。有需要的小伙伴,建议收藏。
SQL 语句性能优化策略 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 2、应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认值,但大多数时候应该使用 3、应尽量避免在 WHERE 子句中使用 != 或 <> 操作符。MySQL 只有对以下操作符才使用索引: 4、应尽量避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用 UNION 合并查询。 5、IN 和 NOT IN 也要慎用,否则会导致全表扫描。对于连续的数值,能用 BETWEEN 就不要用 IN。 6、下面的查询也将导致全表扫描: select id from t where name like‘%abc%’//用到索引 或者 select id from t where name like‘%abc’//若要提高效率,可以考虑全文检索 7、如果在 WHERE 子句中使用参数,也会导致全表扫描。 8、应尽量避免在 WHERE 子句中对字段进行表达式操作和函数操作。 9、很多时候用 10、索引固然可以提高相应的 SELECT 的效率,但同时也降低了 11、应尽可能的避免更新 12、尽量使用数字型,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储。 13、尽可能的使用 14、最好不要使用返回所有: 15、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。 16、使用表的别名(Alias):当在 SQL 语句中连接多个表时,请使用表的别名并把别名前缀于每个 17、使用“临时表”暂存中间结果 。 简化 SQL 语句的重要方法就是采用临时表暂存中间结果。将临时结果暂存在临时表,后面的查询就在 18、一些 SQL 查询语句应加上 使用 nolock 有3条原则:
19、常见的简化规则如下:不要有超过 5 个以上的表连接( 20、将需要查询的结果预先计算好放在表中,查询的时候再 21、用 OR 字句可以分解成多个查询,并且通过 22、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断次数。 23、尽量将数据的处理工作放在服务器上,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划、且存储在数据库中的 SQL 语句,是控制流语言的集合,速度当然快。反复执行的动态 SQL,可以使用临时存储过程,该过程(临时表)被放在 24、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用配制线程数量< 最大连接数,启用 SQL SERVER 的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。 25、查询的关联同写的顺序 : select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B, B = '号码') select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B, B = '号码', A = '号码') select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = '号码', A = '号码') 26、尽量使用 EXISTS 代替 27、尽量使用 “>=”,不要使用 “>”。 28、索引的使用规范:
29、下列 SQL 条件语句中的列都建有恰当的索引,但执行速度却非常慢: SELECT * FROM record WHERE substrINg(card_no, 1, 4) = '5378' --13秒 SELECT * FROM record WHERE amount/30 < 1000 --11秒 SELECT * FROM record WHERE convert(char(10), date, 112) = '19991201' --10秒 分析: WHERE 子句中对列的任何操作结果都是在 SQL 运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引。如果这些结果在查询编译时就能得到,那么就可以被 SQL 优化器优化,使用索引,避免表搜索,因此将 SQL 重写成下面这样: SELECT * FROM record WHERE card_no like '5378%' -- < 1秒 SELECT * FROM record WHERE amount < 1000*30 -- < 1秒 SELECT * FROM record WHERE date = '1999/12/01' -- < 1秒 30、当有一批处理的插入或更新时,用批量插入或批量更新,绝不会一条条记录的去更新。 31、在所有的存储过程中,能够用 SQL 语句的,绝不用循环去实现。 32、选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,在 FROM 子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。如果有 3 个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。 33、提高 34、SQL 语句用大写,因为 Oracle 总是先解析 SQL 语句,把小写的字母转换成大写的再执行。 35、别名的使用,别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速度要比建连接表快 1.5 倍。 36、避免死锁,在你的存储过程和触发器中访问同一个表时总以相同的顺序;事务应尽可能地缩短,减少数据量的涉及;永远不要在事务中等待用户输入。 37、避免使用临时表,除非有需要,可以使用表变量代替。大多数时候(99%),表变量驻扎在内存中,因此速度比临时表更快,临时表驻扎在 TempDb 数据库中,因此临时表上的操作需要跨数据库通信,速度自然慢。 38、最好不要使用触发器:
39、索引创建规则:
40、MySQL 查询优化总结:
41、MySQL 备份过程:
42、查询缓冲并不自动处理空格,因此,在写 SQL 语句时,应尽量减少空格的使用,尤其是在 SQL 首和尾的空格(因为查询缓冲并不自动截取首尾空格)。 43、member 用 mid 做标准进行分表方便查询么?一般的业务需求中基本上都是以 username 为查询依据,正常应当是 username 做 hash 取模来分表。而分表的话 MySQL 的 44、我们应该为数据库里的每张表都设置一个 ID 做为其主键,而且最好的是一个 INT 型的(推荐使用 45、在所有的存储过程和触发器的开始处设置 46、MySQL 查询可以启用高速查询缓存。这是提高数据库性能的有效MySQL优化方法之一。当同一个查询被执行多次时,从缓存中提取数据和直接从数据库中返回数据快很多。 47、 使用 EXPLAIN 关键字可以让你知道 MySQL 是如何处理你的 SQL 语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的。 48、当只要一行数据时使用 LIMIT 1 : 当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。在这种情况下,加上 49、选择表合适存储引擎: myisam:应用时以读和插入操作为主,只有少量的更新和删除,并且对事务的完整性,并发性要求不是很高的。 InnoDB:事务处理,以及并发条件下要求数据的一致性。除了插入和查询外,包括很多的更新和删除。(InnoDB 有效地降低删除和更新导致的锁定)。 对于支持事务的 InnoDB类 型的表来说,影响速度的主要原因是 50、优化表的数据类型,选择合适的数据类型: 原则:更小通常更好,简单就好,所有字段都得有默认值,尽量避免 NULL。 MySQL可以很好的支持大数据量的存取,但是一般来说,数据库中的表越小,在它上面执行的查询也就会越快。 因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 同样的,如果可以的话,我们应该使用 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为 51、字符串数据类型:char, varchar, text 。 52、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。 推荐教程:《MySQL教程》 |
