网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

MYSQL查询条件的函数的用法

本篇内容主要讲解“MySQL查询条件的函数的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MYSQL查询条件的函数的用法”吧!

创新互联建站是专业的黔西南州网站建设公司,黔西南州接单;提供做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行黔西南州网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

偶然想起一事,具体的人和场景就不提了,事情是一条语句,明明是很简单的一句话,有索引,验证也是很快了,但只要在程序里面就慢的要死。后来发现是在语句后面使用了某函数,造成了问题。OK 我们来做一个测试,稍微的还原一下场景。

我们创建一个表

CREATE TABLE `rand_table` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `msg_code` varchar(20) DEFAULT NULL,

  `insert_date` datetime DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

创建一个存储过程来进行数据的填充

create PROCEDURE insert_data()

   begin 

declare i int;

    declare msg int;

    declare msg_ch varchar(20);

    set i = 1;

    set msg = 1;

      while i < 10000000 do

      set msg=  floor(rand()*10000);

      set msg_ch=convert(msg,CHAR);

      insert into rand_table (msg_code,insert_date) values (msg_ch,now());

      set i=i+1;

  end while;

end    

然后我们给这个“白开水的表”创建索引,并且查询,OK 一定是走索引的。

MYSQL查询条件的函数的用法

下面的语句目的是随机的选择一个数来匹配rand_table  中的一个字段,

select * from rand_table where msg_code = floor(rand()*1000);

MYSQL查询条件的函数的用法

结果是可以出来的,没有问题,但反过来在看看执行计划, 80几万的数据要全表扫描,这怎么看上去都不美好。

MYSQL查询条件的函数的用法

写这个语句的人,怀疑是数据的分布有问题,经过验证不是,并且都后面的filtered 看也不可能是这个问题,下图可以看到,缺失不是因为数据分布造成的问题。

MYSQL查询条件的函数的用法

那到底是怎么产生这个问题的,MYSQL 的在查询中,由于后面的函数rand() 是一个随机的函数,他反馈的也是一个随机的值,相关的对比不是获得了值后进行查询而是每一行都需要和随机值对比,虽然随机值在对比的时候应该是一致的。

我觉得我说道这里,已经有人抱着怀疑的心态,想着这人是不是在 胡说八道的心情在看这段文字了,OK  我们来验证一下。下面是两个自建的函数,就是要证明我上边说的不是胡说八道,注意两个函数没有大的区别,仅仅在

DETERMINISTIC 上有区别,下边的第一个

DELIMITER $$

create function pick_up_rand() returns int

   DETERMINISTIC

     BEGIN

     RETURN floor(rand()*1000);

     end

     $$

DELIMITER $$

create function pick_up_rand_n() returns int

        NOT  DETERMINISTIC

          BEGIN

          RETURN floor(rand()*1000);

          end

     $$

从下图看,1 证明我的观点是正确的,的确不确定的数值在MYSQL 中是要进行全表扫描的, 2 类似这样的问题,可以采用在写一个函数,并且将其确定化来满足这样的需求,同时也满足MYSQL 查询优化器选择索引的可能性。

MYSQL查询条件的函数的用法

到此,相信大家对“MYSQL查询条件的函数的用法”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享标题:MYSQL查询条件的函数的用法
文章地址:http://bjjierui.cn/article/jegjci.html

其他资讯