关于MySQL的30条优化技巧,超实用

2023-06-09 0 949

1.应尽量减少在 where 从句中采用!=或<>操作方式符,不然发动机将舍弃采用检索而展开全表扫描器。

2. 对查阅展开强化,应尽量减少全表扫描器,具体来说应考量在 where 及 order by 牵涉的罚以创建检索。

3. 应尽量减少在 where 从句中对表头展开 null 值推论,不然将引致发动机舍弃采用检索而展开全表扫描器。如:select id from t where num is null能在num上增设缺省0,保证表中num列没null值,接着这种查阅:select id from t where num=0

4. 尽量减少在 where 从句中采用 or 来相连前提,不然将引致发动机舍弃采用检索而展开全表扫描器。如:select id from t where num=10 or num=20能这种查阅:select id from t where num=10union all select id from t where num=20

5. 上面的查阅也将引致全表扫描器:(难以后置SOH)select id from t where name like ‘%c%’上面走检索select id from t where name like ‘c%’若要降低成本,能考量中文信息。

6. in 和 not in 也要禁用,不然会引致全表扫描器。如:select id from t where num in(1,2,3)对已连续的值,会用 between 就千万别用 in 了:select id from t where num between 1 and 3

7. 假如在 where 从句中采用模块,也会引致全表扫描器。即使SQL多于在运转TNUMBERV12V4会导出返回值,但强化流程难以将出访方案的优先选择延后到运转时;它要在校对时展开优先选择。不过,假如在校对时创建出访方案,表达式的值却是未明的,因此无法做为检索优先选择的输出项。如上面句子将展开全表扫描器:select id from t where num=@num能改成强制性查阅采用检索:select id from t with(index(检索名)) where num=@num

8. 应尽量减少在 where 从句中对表头展开表达式操作方式,这将引致发动机舍弃采用检索而展开全表扫描器。如:select id from t where num/2=100应改成:select id from t where num=100*2

9. 应尽量减少在where从句中对表头展开表达式操作方式,这将引致发动机舍弃采用检索而展开全表扫描器。如:select id from t where substring(name,1,3)=’abc’ –name以abc开头的id

select id from t where datediff(day,createdate,’2005-11-30′)=0 –’2005-11-30′生成的id应改成:select id from t where name like ‘abc%’select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′

10. 千万别在 where 从句中的“=”左边展开表达式.算术运算或其他表达式运算,不然系统将可能难以正确使用检索。

11. 在采用检索表头做为前提时,假如该检索是复合检索,那么要采用到该检索中的第一个表头做为前提TNUMBERV12V4能保证系统采用该检索,不然该检索将不会被使 用,并且应尽可能的让表头顺序与检索顺序相一致。

12. 千万别写一些没意义的查阅,如需要生成一个空表结构:select col1,col2 into #t from t where 1=0这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这种:create table #t(…)

13. 很多时候用exists代替in是一个好的优先选择:select num from a where num in(select num from b)用上面的语句替换:select num from a where exists(select 1 from b where num=a.num)

14. 并不是所有检索对查阅都有效,SQL是根据表中数据来展开查阅强化的,当检索列有大量数据重复时,SQL查阅可能不会去利用检索,如一表中有表头 sex,male.female几乎各一半,那么即使在sex上建了检索也对查阅效率起不了作用。

15. 检索并不是越多越好,检索固然能提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,即使 insert 或 update 时有可能会重建检索,所以怎样建检索需要慎重考量,视具体情况而定。一个表的检索数较好千万别超过6个,若太多则应考量一些不常采用到的罚以建的检索是否有 必要。

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

17. 尽量采用数字型表头,若只含值信息的表头尽量千万别设计为字符型,这会降低查阅和相连的性能,并会增加存储开销。这是即使发动机在处理查阅和相连时会 逐个比较字符串中每一个字符,而对数字型而言只需要比较一次就够了。

18. 尽可能的采用 varchar/nvarchar 代替 char/nchar ,即使具体来说变长表头存储空间小,能节省存储空间,其次对查阅来说,在一个相对较小的表头内搜索效率显然要高些。

19. 任何地方都千万别采用 select * from t ,用具体的表头列表代替“*”,千万别返回用不到的任何表头。

20. 尽量采用表表达式来代替临时表。假如表表达式包含大量数据,请注意检索非常有限(多于主键检索)。

关于MySQL的30条优化技巧,超实用

21. 避免频繁创建和删除临时表,以减少系统表资源的消耗。

22. 临时表并不是不可采用,适当地采用它们能使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,较好使 用导出表。

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

24. 假如采用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,接着 drop table ,这种能避免系统表的较长时间锁定。

25. 尽量减少采用游标,即使游标的效率较差,假如游标操作方式的数据超过1万行,那么就应该考量改写。

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

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

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

29. 尽量减少向客户端返回大数据量,若数据量过大,应该考量相应需求是否合理。

30. 尽量减少大事务操作方式,提高系统并发能力。

数据库入门到精通:

MySQL数据库入门到精通,从mysql安装到mysql高级、mysql强化全囊括

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务