mysql语句优化

Mysql语句优化

1、使用select语句尽量多用字段,使用 * 效率更低。因为使用 * ,数据库还要去查询数据字典,然后解析列名,直接写列名会提高效率。

select * from user;
要写成
select userID,userName,userSalary from user;

2、 查询数量,select(*)会有一个展开的过程,建议用字段,但是count(*)不会直接展开,直接就是扫描,查询数量,而count(1)还要找到对应的字段所以效率就低了。

3、 查询一条语句,尽量在后面加上“limit1”(数据库查询到一条即停止)。

4、快速插入语句: 例如:

insert into user(name) values(‘m’); insert into user(name) values(‘n’);
改为,
insert into user(name) values(‘m’), (‘n’);

SQL语句优化遵循原则
1、尽量避免在列上运算,这样会导致索引失效。

2、使用 JOIN 时,应该用小结果集驱动大结果集,同时把复杂的 JOIN 查询拆分成多个query,因为JOIN 多个表,可能导致更多的锁定和堵塞。

3、使用LIKE 时,避免使用 %%。

4、select 指定查询字段,不要全查出来,节省内存。

5、使用批量插入语句节省交互。

6、limit的基数比较大时,使用 between,between 限定比 limit 快,但是between也有缺陷,如果id中间有断行或是中间部分id不读取的情况,数据会少。
例如:

select * from t where 1 limit 100000,10 ;
可改为:
select * from twhere id between 100000 and 100010

7、不要使用rand 函数取多条随机记录。

8、避免使用 NULL。

9、不要做无谓的排序操作,而应尽可能在索引中完成排序。

10、删除所有记录的时候,用truncate 替代 delete,因为 delete 删除记录时,会扫描整个表,然后再一条一条删除,而 truncate table user; 是一次性删除整个表的所有内容,会提高效率。

11、尽量多使用commit,因为 commit 会释放回滚点 callback。

12、用 where 子句替换 having 子句,where 先执行,having 后执行。因为 having 会先分组,比较占内存。

13、多使用内部函数提高SQL效率,例如多使用concat连接,代替‘||’的符号连接。

14、表名过长时,尽量使用表的别名,因为长表名更加的耗费扫描时间。

15、使用列的别名,同样地,长列名也会耗费扫描时间。

16、二者都能使用尽量使用where(与having比较):where先过滤(数据就少了)再分组 。

17、例:

select a.*, b.* 
from a,b 
where a.id=b.a_id;

 注意from后面的表名,
  (1).如果多表查询是完全无关系的话,将记录和列名最少的表写在最后,然后依次类推
  (2).如果多表查询是有关系的话,将引用最多的表放在最后,然后依次类推,这样速度会有所提高。
18、where子句中的连接顺序(where也采用从右往左解析):

当使用where子句连接的时候,要将可以过滤掉最大数量记录的条件写在where子句的最右边,这样,可以过滤掉大量数据后,再执行其他条件,可以提高效率。

 


SQL优化持续更新中。。

posted on 2018-03-22 11:04  xxxidaizy  阅读(177)  评论(0编辑  收藏  举报