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优化持续更新中。。