sql优化操作

来源:互联网 发布:西单附近美食知乎 编辑:程序博客网 时间:2024/04/18 14:48

insert优化:

1,当同一个用户插入很多行的时候,应该尽量使用多个表的insert语句,这种方式将大大减少客户端与数据库之间的连接,关闭等等消耗,因为每一次插入数据都会执行连接数据库,关闭数据库等等操作;如下:

insert into test valus(1,2),(3,4),(5,6),(7,8)................

2,如果是不同的用户插入很多行,可以使用insert delayed 语句得到更高的速度,该参数表示立刻执行,这样就会把所有的插入数据放在内存的队列中,并没有真正地写入磁盘中,而是用low_priority恰好相反,在所有的用户对表的读写完成后才会进行插入;

3,将索引文件和数据文件分在不同的·1磁盘上存放;

order by 优化:

1,可以在order by 字段上建立索引,这样,order by效率就会提高;

2,如果一个sql语句里面含有where 条件还有order by 条件的话,可以将where条件的字段和order by 条件的字段做一个联合索引;

但是如果是where 条件里面是in某些值的话,不能实现联合索引;

3,如果where条件加上多个order by条件可以在where条件和多个order by 上建立索引;

group by 优化:

如果group by 仅仅是为了获取符合条件的唯一数据,而不做排序的话,可以考虑使用 group by ** order by null 效率会高很多;

嵌套查询优化:

很多时候对于一些子查询可以使用join查询来代替,如select * from ticket where id in (select ticketid from scenery) 可以使用select * from ticket left join scenery on ticket.id = scenery.ticketid where scenery.ticketid is null;联表查询会比子查询效率高很多;
or条件查询:

对于or条件查询,如果要利用索引,则or之间的每个条件列都必须使用索引,如果没有索引,应该考虑增加索引;

优化分页查询:

1,分页查询其实是一个很消耗资源的操作,因为如同下面的分页操作,limit 100,10,这样的排序操作会首先扫描前面的100条数据,然后不使用,等着下面的10条数据;所以有时候分页操作可以考虑其他的思路,比如select id,name from ticket  order by createdtime limit 100,10 可以考虑用下面的语句更换select t.id,t.name from ticket t inner join (select * from id from ticket order by createdtime limit 100,10)b on a.id = b.id;这种语句可以减少可能少的数据;

2,如果分页里面还按照某个字段排序的话,可以把limit查询转换成对于某个位置的查询, 例如我们可以将上一次查询的最后一个数存起来,下一页的时候就从这个值开始取下面一页,如,select 8 from ticket where id < 300 order by id desc limit 10 这样就会效率高恒多,特别是到页数很多的时候效率能够上升几十倍;

临时表的使用:

1,善于使用mysql临时表,当我们的sql语句里面含有group by 和 order by 并且两个字段不一样的时候,使用临时表

2,在join查询的时候 在where条件或者order by ,group by 的条件不是联表的第一个表的列的时候应该使用临时表;

3,ORDER BY中使用了DISTINCT关键字 ORDERY BY DISTINCT(price)时使用临时表;

4,SELECT语句中指定了SQL_SMALL_RESULT关键字 SQL_SMALL_RESULT的意思就是告诉MySQL,结果会很小,请直接使用内存临时表,不需要使用索引排序 SQL_SMALL_RESULT必须和GROUP BY、DISTINCT或DISTINCTROW一起使用

5,表包含TEXT或者BLOB列可以考虑使用磁盘临时表;

一些sql提示:

1,可以使用use index 写在查询语句的后面来提示你希望该sql使用什么样的索引列表,就可以让sql优先考虑用这个索引。

SELECT *** FROM TABLE USE INDEX(key_list)] WHERE ……对于这个key_list 可以是各种单一索引,也可以是复合索引;

2,可以使用ignore index 写在查询语句的后面来提示你忽略该sql使用什么样的索引列表,就可以让sql不再考虑他的索引。

SELECT *** FROM TABLE IGNORE INDEX(key_list)] WHERE ……对于这个key_list 可以是各种单一索引,也可以是复合索引;

3,可以使用force index 写在查询语句的后面来提示你强制该sql使用什么样的索引,就可以让sql不再考虑他的索引。

SELECT *** FROM TABLE FORCE INDEX(key_list)] WHERE ……对于这个key_list 可以是各种单一索引,也可以是复合索引;



 


1 0
原创粉丝点击