SQL语句优化经典小技巧

来源:互联网 发布:网络阅读的利与弊 编辑:程序博客网 时间:2024/05/01 16:43

1,对于MyISAM引擎,当导入大批量数据的时候,可以先将他的一些keys禁用掉:

alter table table_name disable keys;

再加载数据:loading data;

再重新启用keys:altertable table_name enable keys;

如果不禁用keys会比较慢,因为只要向里添加一条数据就做索引,就会很慢,禁用以后,先将数据导入进去,再启用keys,就会先导入全部数据,再由数据库慢慢的为每一条记录做索引就OK了。

 

对于Innodb引擎,将要导入的数据按照主键排序时,设置set unique_check=0,即关闭唯一性校验,如果不关闭,每次添加的时候都要校验一次,会很慢,当然你也要保证添加的主键没有重复的。还有一个设置就是:set autocommit=0,即关闭自动提交。

 

MyISAM和Innodb的区别是什么?(创建数据库时使用的是什么引擎,建立表时使用的就是什么引擎)

1)MyISAM不支持外键,Innodb支持外键。

2)MyISAM不支持事务,Innodb支持事务。

3)数据的存储方式不同。Innodb在建立表的时候只会将表结构文件*.frm放到%MySQL%\data\数据库名 下,而不会将数据文件放到这里。那么他去哪了呢?它其实是在%MySQL%\data下的ibdata1中。如果是MyISAM引擎,就会将常规的三个数据文件创建到数据库中。

 

创建表的时候指定引擎:create table tt2(id int)engine=MyISAM;建立后,创建三个文件在数据库里。然后向里面疯狂的添加数据。再通过delete删除一些记录,这时会发现,数据文件并没有变小。所以MyISAM删除的时候空间不释放。那么以后如果程序上线,用户大批量的向里添加数据,你即使对这个表的数据做了delete操作,空间也不会释放,会越长越大,总有一天硬盘空间会受不了。要对引擎为MyISAM的表定时清理,通过指令:optimize table 表名,这个指令会释放空间。

MyISAM的查询速度很快,为什么很快呢?因为删除的时候空间不释放。

 

常见的SQL优化手法:

1)使用order by null 来禁用排序。使用group by的时候默认会对分组的字段排序。

例如我们分析下面语句:


执行语句select* from dept group by dname order by null;就不会使用排序了。


2)有些时候,可以使用连接来代替子查询。尽量少使用子查询,多使用join。因为join不会在内存中创建临时表,所以速度较快。

3)如果想要在含有or的查询语句中利用索引,则or之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引。例如:如果必须执行查询语句:select * from 表名 where 条件1=”...” or 条件2=”...”;那就必须为条件1和条件2都加索引,才可以。

 

选择合适的数据类型:

1)在精度要求高的应用中,建议使用定点数(decimal)来存储数值,以保证结果的准确性。

例如我们要在数据库保存100000.32万美金这样的数据,通常我们会使用float来存储。

我们可能会这样:create table sal(t1 float(10,2));创建表。这样查询出的结果会有问题,如下:


如果这样定义:create table sal2(t1 decimal(10,2));

在查询结果就OK了。


2)日期类型要根据实际需要选择能够满足应用的最小存储的早期类型。

如果使用int或bigint存放时间类型的数据,例如:

create table bbs(id int,con varchar(1024),pub_timeint);

查询的时候,可以使用date来将int转化成日期:date(‘Ymd’,时间*24*60*60);

但是使用这个date的时候是有问题的,这个date表示的日期范围是1970年1月1日到2038年1月19日。如果超出这个年限,就不合适了。

这里的年数限制并不是date的问题,而是操作系统的问题,windows32位限制是上面的日期。如果是64为就可以表示比这个更大的日期了。

如果超出年限,就会自动回到1970年。
0 0