sql语句or的优化
1. sql优化问题 用到了or,怎么对or进行优化
看具体的代码,是怎么个OR法。
1、不同的逻辑组合 -- 改为UNION,使查询时各自采用恰当的Index
2、多个代码匹配组合 -->改为IN(。。。)
2. 如何进行SQL性能优化
这里分享下mysql优化的几种方法。
1、首先在打开的软件中,需要分别为每一个表创建 InnoDB FILE的文件。
3. sql or 语句优化问题
试试这个:
SELECT * FROM get_childs1('1')
WHERE addorgid=childid
OR receiveorgid=childid
OR sendorgid=childid
OR adddeptid =childid
OR senddeptid =childid
OR receivedeptid=childid
改成:
SELECT * FROM get_childs1('1')
WHERE childid in(addorgid,receiveorgid,sendorgid,adddeptid,senddeptid,receivedeptid)
4. 请问SQL语句优化的策略都有哪些
●
创建表的时候。应尽量建立主键,根据主键查询数据;
●
大数据表删除,用truncate
table代替delete。
●
合理使用索引,在OLTP应用中一张表的索引不要太多。组合索引的列顺序尽量与查询条件列顺序保持一致;对于数据操作频繁的表,索引需要定期重建,以减少失效的索引和碎片。
●
查询尽量用确定的列名,少用*号。
尽量少嵌套子查询,这种查询会消耗大量的CPU资源;对于有比较多
or运算的查询,建议分成多个查询,用union
all联结起来;多表查询
的查询语句中,选择最有效率的表名顺序(基于规则的优化器中有效)。Oracle解析器对表解析从右到左,所以记录少的表放在右边。
●
尽量多用commit语句提交事务,可以及时释放资源、解
锁、释放日志空间、减少管理花费;在频繁的、性能要求比较高的
数据操作中,尽量避免远程访问,如数据库链等,访问频繁的表可以常驻内存:alter
table...cache;
5. 如何优化带or条件的sql
可以把or条件换成 union,union 比or 本身要快很多。
另外根据需要增加条件列上的索引。
注意 union all 和union 的区别
6. sql优化的N种方法
1.SQL语句中IN包含的值不应过多:
例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了; 实测速度差距不是很大.
2.SELECT语句务必指明字段名称:
禁止用 * 来查询 ,禁止用 * 来查询 ,禁止用 * 来查询 , 查找哪个字段,就写具体的字段.
select * from user_test WHERE address=15988;
select address from user_test WHERE address=15988;
3.只查询一条数据的时候,使用limit 1
【这个很有用】
4.避免在where子句中对字段进行null值判断:
【实测:null值的判断依然走了索引】
explain select uid from user_test WHERE phone is null;
5.避免在where子句中对字段进行表达式操作:
6.对于联合索引来说,要遵守最左前缀法则:
例如组合索引(id,name,sex) 使用的时候,可以id 或者id,name . 禁止直接name,或者sex.会导致联合索引失败
注意: id, name,sex 这三个字段填写顺序不会有影响, mysql会自动优化成最左匹配的顺序.
前三条sql都能命中索引,中间两条由于不符合最左匹配原则,索引失效.
最后一条sql 由于有最左索引id 所以索引部分成功,部分失效. id字段索引使用成功.
7.尽量使用inner join,避免left join:
如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表。
【实测:不是很准确,具体用explain测试】
8.注意范围查询语句:
对于联合索引来说,如果存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效。
解决办法: 业务允许的情况下,使用 >= 或者<= 这样不影响索引的使用.
explain select * from user_test where uid=10 and name='张三' and phone='13527748096';
explain select * from user_test where uid between( 1 and 10) and name ='张三' and phone='13527748096';
9.不建议使用%前缀模糊查询:
例如 : LIKE“%name”或者LIKE“%name%”,这种查询会导致索引失效而进行全表扫描。但是可以使用LIKE “name%”。
explain select * from user_test where uid=10 and uid like "%1" ;
explain select * from user_test where uid=10 and uid like "1%" ;
10.在 where 子句中使用 or 来连接条件,如果or连接的条件有一方没有索引,将导致引擎放弃使用索引而进行全表扫描
解决办法: 将or连接的双方都建立索引,就可以使用.
explain select * from user_test where uid=10 or name='张三';
11.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。(此处存在疑点,我本人测试的时候,发现索引还是能使用到)
12.字符串类型的字段 查询的时候如果不加引号'' ,会导致自动进行隐式转换,然后索引失效
7. 如何优化带or条件的sql
可以把or条件换成 union,union 比or 本身要快很多。 另外根据需要增加条件列上的索引。 注意 union all 和union 的区别
8. SQL语句的几种优化方法
1、尽可能建立索引,包括条件列,连接列,外键列等。
2、尽可能让where中的列顺序与复合索引的列顺序一致。
3、尽可能不要select *,而只列出自己需要的字段列表。
4、尽可能减少子查询的层数。
5、尽可能在子查询中进行数据筛选 。
9. sql语句优化
1.查看链接查询部分是不是键和索引
2.检查d.area_id是不是有索引
3.检查a.alloc_date是不是有索引
4.将Or链接的条件改成union all的方式来查询
5.(可能是关键)to_char(a.alloc_date,'yyyymm')>='200805' 这个函数方式的,改为直接方式的a.alloc_date >= date'2008-05-01' 避免全表扫描
6.(也可能是关键)检查类型一致性,area_id in d.area_id in (17000124,17000125,17000126,17000127) 这个就要求area_id 一定是数值的,否则很大几率对area_id做转换函数从而全表扫描的。如果是字符串的in后面的每一项就应该加上单引号。
7.经in语法改成or语法
8.如果还不行的话,根据表的大小情况做成嵌套查询,以便强制条件的应用顺序,以避免先连接再筛选的情况发生。
以上只是建议,具体的如果我猜的不错的话用的是oracle,那么在PL/SQL里面将查询部分摘出来,执行后按F5就可以看到解释计划窗口了,看看瓶颈在什么地方
10. MySQL百万级数据表or查询优化
目前公司的订单表有100多万条,使用订单号查询数据时,所需时间大多要10-30秒不等,查看了慢查询日志,发现有的订单查询竟然耗时65秒
我查看了原有的查询语句,发现where后面跟了or查询,虽然3个or都索引,使用explain分析查询结果,发现要扫描近70万行,几乎是全盘扫描一遍,只为获取最多3条数据,效率实在是低下
这3个字段均设置了索引,但or在这个语句中,使索引失效了(主要看最后几行)
使用union all代替or查询,也就是说把3个字段的查询分别做查询,将结果使用union all连接在一起,这样单次查询可以用到索引,效率大大提高
先看一下分析结果
简要的sql语句,查询结果不超80ms