在行ID中搜索大型Mysql数据库的确切日期

时间:2016-09-28 15:44:09

标签: php mysql database

我有一个大的10gb大的mysql数据库。数据库中的一个表称为

clients

在该表中有一个名为

的列
case

创建此客户端的日期将与此列中的数字混合。

以下是case

中条目的示例
011706-0001

06部分意味着此客户端是在2006年创建的。我需要提取在2015年和2016年创建的所有客户端。所以我需要查询case在破折号之前有15或16的任何内容

例如,000015-0000000016-0000

有没有办法只用mysql做到这一点?我的思考过程是我必须查询整个列然后使用php到preg_match()

我担心根据数据库的大小,这会导致问题。

1 个答案:

答案 0 :(得分:4)

查找c列值包含case的行(字符0和6后跟短划线...

一种选择是使用LIKE比较运算符:

'06-'

百分号字符是LIKE比较中的通配符,它​​匹配任意数量的字符(零,一个或多个)。

MySQL需要为表中的每个行评估该条件。 MySQL无法利用索引范围扫描操作。

 SELECT ...
   FROM clients t
  WHERE t.case LIKE '%06-%'
  ORDER BY ...

对于包含三个字符 SELECT ... FROM clients t WHERE t.case LIKE '%15-%' OR t.case LIKE '%16-%' ORDER BY ... '15-'的序列的任何值,这将评估为真。

如果'16-'列中的值有更标准的格式,其中值总是以代表日期case的六个字符开头,并且您只想匹配第5到第7个字符,那么可以使用匹配任何一个字符的下划线通配符(在LIKE比较中)例如...使用四个下划线

'mmddyy-nnnnn'

或者您可以使用 t.case LIKE '____16-%' 函数从SUBSTR值中提取三个字符,并执行相等比较...

case

也可以使用 SUBSTR(t.case,5,3) = '15-' SUBSTR(t.case,5,3) IN ('15-','16-') 比较代替REGEXP比较。

就性能而言,所有上述方法都需要在表中的每一行进行,以评估比较条件。

如果该日期值作为单独的列存储,作为DATE数据类型,并且有一个索引作为前导列,则MySQL可以有效地使用范围扫描操作,对于这样的查询。

LIKE