PHP

来源:互联网 发布:android应用程序优化 编辑:程序博客网 时间:2024/05/19 14:54

遇到的问题:业务线对线索ID和电话号码进行模糊搜索,要解决的问题也就是 mysql中对int类型的数据进行模糊搜索,主要是考虑工作量和效率之间的关系,表数据200W左右

表类型如下:

CREATE TABLE `table_xxx_linkman` (  `customer_name` varchar(40) NOT NULL DEFAULT '' COMMENT '联系人姓名',  `telephone` int(11) NOT NULL DEFAULT '' COMMENT '联系人手机号',    ...) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='客户联系人表';CREATE TABLE `shops_customer_demand` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '客户租售表主键ID',  ...  PRIMARY KEY (`id`),) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='客户租售线索表';

想到的解决方法有两种:

一种是在表结构中添加varchar类型的检索列,优点当有like业务时,检索此列,快速查找,缺点是多出一列无用的数据,表数据越多,缺点越明显。ps: 之前有老旧的数据把手机号存成int(11),显然是非常不合理的。

COMMENT='客户联系人表';ALTER TABLE `table_xxx_linkman` ADD COLUMN `search_telephone` char(11) NOT NULL DEFAULT '' COMMENT '手机号(用于查询)' AFTER `telephone`;

执行这条sql,int类型的like搜索完美解决,优缺点在之前说过,不在叙述。


想到的第二个方法就不用这样了,因为时间和业务线的考虑我选用了第二种方法,(商铺业务线本身没有那么大搜索的需求,牺牲了sql执行时间)。

在业务底层拼接sql,使用cast函数,cast 函数强转类型进行like模糊匹配,代码如下:

    ... where 1 and  ( CAST(cd.id as Char) LIKE '%27%' or CAST(l.telephone as Char) LIKE '%27%' ) ORDER BY cd.weight DESC , cd.id DESC

mysql cast函数扩展 :

  1. BINARY[(N)]
  2. CHAR[(N)]
  3. DATE
  4. DATETIME
  5. DECIMAL
  6. SIGNED [INTEGER]
  7. TIME
  8. UNSIGNED [INTEGER]
使用CAST将varchar转换成int类型排序
select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10;
使用CONVERT将varchar转换成int类型排序
select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10

经过测试20万数据,第一次执行后大概20.01ms,之后的执行因为触发器里有缓存后,误差就可以忽略不计了。记录起来,也分享给你们。

原创粉丝点击