美文网首页
SQL性能优化

SQL性能优化

作者: coder_girl | 来源:发表于2021-08-06 10:47 被阅读0次

    1.sql无效表删除

    2.查看sql消耗时间,执行时间,抓取数据时间。

    3.执行时间过多,查询执行器,查看执行器消耗情况。

    4.强关联放在where后,否则放在了 join后

    5.强制索引 force index(索引名)

    6.分页插件:mapper,xml 加上查询总数(名字必须:之前查询名+_count)

    6.distinct 存在的必要?多表关联(去重,排序在java进行)

    7.无查询关联条件,_count的查询去掉相关表;

    8,枚举,!= ,另外条件=

    9.常量,近常量放在redis

    【10.脚本->开发->测试->压测
    压测修改脚本,放到测试和开发】

    11.联合索引【联合索引的最左前缀匹配指的是where条件一定要有联合索引的第一个字段是否走联合索引与where条件的顺序无关,只与字段有关】

    1. 消耗时速不太要紧,连接时速问题较大,不需要分页插件就不要用(拖延时间)

    13,首先考虑在where及order by 涉及的列上建立索引

    14,避免where子句对字段进行null判断(会使引擎放弃使用索引而进行全表扫描)

    15,尽量避免在where里有!=或<>(会使引擎放弃使用索引而进行全表扫描)

    16, 尽量避免在where里使用 or (会使引擎放弃使用索引而进行全表扫描),可用union 连接两个查询结果

    17.in 和 not in 可用between和exists代替

    18.不用模糊查询,可采用全文检索(“%”索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。)

    【通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索可能非常耗时。】

    17.如果在 where 子句中使用参数,也会导致全表扫描。(因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项)

    18.避免在where子句对字段进行表达式操作(会使引擎放弃使用索引而进行全表扫描)

    19.避免在where子句中进行函数操作(会使引擎放弃使用索引而进行全表扫描)

    20.不要在where子句重的=左边运用函数(会使引擎放弃使用索引而进行全表扫描)

    21,在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

    22.不要写没意义的查询,会生成空表结构

    23,不要update全部字段,造成性能消耗

    24.对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。

    1. 不带任何条件的count会全表扫描

    26.索引提高了select效率会降低insert和update的效率(insert,update都有可能重建索引),一个表索引最好不超过6个

    27.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据
    列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

    28.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

    29.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

    30..任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段

    31.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)

    32.避免频繁创建和删除临时表,以减少系统表资源的消耗。临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件, 最好使用导出表。

    33.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

    34.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定

    35.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

    36.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

    37.与临时表一样,游标并不是不可使用。对小型数据集使用FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

    38.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

    39.尽量避免大事务操作,提高系统并发能力。

    40.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

    41.提高INSERT的性能 此技术可以提高数据库处理的性能,因
    为MySQL用单条INSERT语句处理多个插入比使用多条INSERT
    语句快。
    更快的删除 如果想从表中删除所有行,不要使用DELETE。
    可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更
    快(TRUNCATE实际是删除原来的表并重新创建一个表,而不
    是逐行删除表中的数据)。

    相关文章

      网友评论

          本文标题:SQL性能优化

          本文链接:https://www.haomeiwen.com/subject/cykmvltx.html