mysql优化,sql语句优化,表优化

时间:2021-05-30 06:05:20

一、sql语句优化


  1、优化insert语句

     一次插入多值:insert into table_name values(1、2),(1、2),(1、2)....

     使用文本文件装载一个表的数据:LOAD DATA INFILE 'C:/Users/907379/Desktop/table.txt' into TABLE asset character set utf8;(导出时采用文本文件)


  2、优化group by语句

     在使用group by时,后面加上order by null可以禁止结果排序,减少查询时间

     可以使用 EXPLAIN SELECT * FROM `t_asset` GROUP BY LANGUAGE_CODE  ORDER BY NULL;查看到Extra中不包含filesort


  3、优化order by语句

     对于order by后面接多个需要排序的字段,所有字段尽量都按相同的顺序排序,都是升序或都是降序


  4、优化嵌套语句

     如从table1查找table2中不存在的数据,一般的话我们会这样写:select * from table1 where tid not in(select tid from table2)

     其实,这时可以用连接(join)来优化子查询:select * from  table1 a left join table2 b on a.tid = b.tid where b.tid is null; 


  5、优化or条件,最好使用索引,并且每个or条件都必须用到索引,如果没有的话,可以考虑添加索引


  6、使用sql提示

     生成一个临时的结果集,减少表锁时间:select sql_buffer_results * from table1

     使用use index希望mysql参考索引列表:select * from table1 use index (ind_id) where id=1

     使用ignore index使mysql忽略一个或多个索引:select * from table1 ignore index (ind_id) where id=1

     使用force index使mysql强制使用特定的索引,比如id>0默认mysql是扫描全盘:select * from table1 force index (ind_id) where id>0 



二、表优化


  1、优化表的数据类型

     使用procedure analyse() 确认要优化的列:select * from table1 procedure analyse();结果中Optimal_fieldtype就是给出的优化建议

     然后通过alter table table1 modify id  INT(9) UNSIGNED NOT NULL (Optimal_fieldtype给出的建议)


  2、通过拆分提高表的访问效率

     a、垂直拆分:把主码和常用的列放到一个表,把主码和不常用的一些列放到一个表(不过会出现冗余列)

     b、水平拆分:把一列或者多列的数据行放到两个独立的表中(比如近3个月的数据放到一个表,历史数据放到另外的表),不过会增加程序的复杂度,一般情况不建议使用


  3、逆规范化

     比如增加冗余列,增加派生列,重新组表,拆分表等提高性能,但需要通过批处理维护,应用逻辑和触发器(最好用的方法)来维护数据的完整性

  4、使用中间表提高统计查询速度

     使用中间复制源表部分数据,与源表相隔离,对源表不会有影响;中间表可以灵活增加临时用的字段,提高效率