当字段上创建了索引,但是where条件中该列前面加了函数时,会使索引失效。有时候可以通过改写sql来优化。

select count(*) from T_SYNCLOG where TO_DAYS(NOW()) - TO_DAYS(CREATE_TIME) = 0 and STATUS=0 and ENTITY_TYPE='org';

推断该sql含义是查看创建日期为今天的记录条数。

表记录有40多万条。该表没有在CREATE_TIME上创建索引。在自己虚拟机上测试,执行该查询需要30秒左右。

解决办法:创建索引,然后改写sql(避免在索引字段前使用函数)

create index ind_cre on T_SYNCLOG (CREATE_TIME);
只查当天创建的日志记录:
USE eip;
SELECT COUNT(*) FROM T_SYNCLOG WHERE CREATE_TIME BETWEEN CURDATE() AND NOW() AND STATUS=0 AND ENTITY_TYPE='org';
查n天前那天创建的日志记录:
USE eip;
SELECT COUNT(*) FROM T_SYNCLOG WHERE CREATE_TIME BETWEEN DATE_SUB(CURDATE(),INTERVAL n DAY)
AND DATE_SUB(DATE_SUB(CURDATE(),INTERVAL n-1 DAY),INTERVAL 1 SECOND)
AND STATUS=0 AND ENTITY_TYPE='org';

效果如下: 当字段上创建了索引,但是where条件中该列前面加了函数时,会使索引失效。有时候可以通过改写sql来优化。如:select count(*) from T_SYNCLOG where TO_DAYS(NOW()) - TO_DAYS(CREATE_TIME) = 0 and STATUS=0 and ENTITY_TYPE='org';推断该sql含义是查看创建日期为今天的记录条数
曾经遇到这样的情况,在数据库的Meeting表有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm:ss,而我们查询时是通过yyyy-mm-dd来进行的,即查询某一天的所有会议信息,这样如果通过select * from Meeting where PublishTime=@PublishTime (参数@PublishTime为yyyy-mm-dd格式)语句进行查询将无法得到正确结果,比如我们要查询2004年12月1日的会议信息,在输入2004-12-01时就不能得到查询结果,而这种查询又不能
最近在用oracle的过程用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了。 blob字段直接用 select * from table_name where column like ‘%%'查找的时候是不能实现的 ,主要是字段不符,就想到了 字段转换成varchar2类,然后再进行查询 select * from table_name where utl_raw.cast_to_varchar2(column) like ‘%oracle%'; 但是却报如下的错误: 在这之后作了修改: select * from tab
1.1、索引的数量不是越多越好,因为索引多了会影响数据增删改的速度,从而引起死锁,所以索引应该建立在查询频率很高的字段上。 1.2、索引列的选择。索引列应该建立在列值重复率低的列上。因为当列值重复率高的时候,索引的查询效率比较低。 1.3、对于有聚集索引的表,表数据的存储顺序是按照聚集索引的第一个列升序排列的。这里顺便提一下,当我们不使用order by来查询一个表的数据时,数据是按照ID自增主键升序显示的,这足以证明刚才的论点。 1.4、主键和聚集索引的关系。主键不允许有重复值,但聚集索
有时候我们在使用sql查询的时候,会涉及到根据日期查询内容,通常做法都是通过日期字段 >= 来判断日期范围的,当数据量大了,你会发现查询速度就会很慢,这时候我们可以做些优化,给日期字段建立索引,更改查询语句,如下例子:         select * from fcz_moment where dep_airport_code='CTU' and air_date ~'2018-02|2...
在项目 往往遇到 数据过几十万百万不到的 数据 查询时延时很大,这种情况往往是很严重的问题,客户不可能点进去一个网页等你几分钟是吧? 比如这条sql 在执行往往遇到瓶颈,使用前面datapart 方法 使用两次 并没有第二个 between 要好 ,索引后 我们发现 不难发现 时间少了 3倍,但是这世间也是挺长的了24秒 能在快点嘛??? 好,我们增一个state 条
很多人不知道SQL语句在SQL SERVER是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如: select * from table1 where name='zhangsan' and tID > 10000 select * from table1 where tID > 10000 and name='zhan...
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。    2.应尽量避免在 where 子句字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:    select id from t where num is null    可以在num上设置默认值0,确保表num列没有null值,然后这样查
例如,查询field1包含值A、B、C的记录: SELECT * FROM table1 WHERE CONCAT(',', field1, ',') IN (',A,', ',B,', ',C,') 这里的CONCAT函数是为了在field1前后上逗号,以确保查询时只匹配完整的值,而不是包含该值的子串。 2. 使用正则表达式 例如,查询field1包含值A、B、C的记录: SELECT * FROM table1 WHERE REGEXP_LIKE(field1, '^(A|B|C)(,|$)') 这里的正则表达式表示以A、B或C开头,后面跟着逗号或字符串结束。这样可以确保只匹配完整的值。