巧用变量减少查询
来源:互联网 发布:返利软件怎么返利 编辑:程序博客网 时间:2024/05/21 09:25
1:用变量排名
例: 以ecshop中的商品表为例,计算每个栏目下的商品数,并按商品数排名.
并按商品数计算这些栏目的名次
2:用变量计算真正影响的行数
当插入多条,当主键重复时,则自动更新,这种效果,可以用insert on duplication for update
例: 以ecshop中的商品表为例,计算每个栏目下的商品数,并按商品数排名.
<span style="font-size:18px;">select cat_id,count(*) as cnt from goods group by cat_id order by cnt desc;</span>
并按商品数计算这些栏目的名次
<span style="font-size:18px;">set @curr_cnt := 0,@prev_cnt := 0, @rank := 0;select cat_id, (@curr_cnt := cnt) as cnt,(@rank := if(@curr_cnt <> @prev_cnt,@rank+1,@rank)) as rank,@prev_cnt := @curr_cnt from ( select cat_id,count(*) as cnt from shop. goods group by shop. goods.cat_id order by cnt desc) as tmp;</span>
2:用变量计算真正影响的行数
当插入多条,当主键重复时,则自动更新,这种效果,可以用insert on duplication for update
要统计真正”新增”的条目, 如下图,我们想得到的值是”1”,即被更新的行数.
<span style="font-size:18px;"> insert into user (uid,uname) values (4,’ds’),(5,'wanu'),(6,’safdsaf’) on duplicate key update uid=values(uid)+(0*(@x:=@x+1)) , uname=values(uname);</span>
<span style="font-size:18px;">set @x:=0;</span>
总影响行数-2*实际update数, 即新增的行数.
3: 简化union
比如有新闻表,news , news_hot,
new_hot是一张内存表,非常快,用来今天的热门新闻.
首页取新闻时,逻辑是这样的:
先取hot, 没有 再取news,为了省事,用一个union来完成.
<span style="font-size:18px;">select nid,title from news_hot where nid=xxxunion select nid,title from news where nid=xxx;</span>
<span style="font-size:18px;">如何利用变量让后半句select不执行 ,select id,content,(@find := 1) from news_hot where id=1 //第一个sql语句会先执行where后面的语句,如果在new_hot找到id=1的记录,就定义@find变量为1,那么</span>
<span style="font-size:18px;">//下面的union的子句where id=1 and (@find <= 0)不成立,就不会去查找news表的内容unionselect id,content,(@find :=1) from news where id=1 and (@find <= 0)union 1,1,1 where (@find :=null) is not null;//这里是重新初始化@find变量</span>
3:小心变量的顺序
如下图:变量先在where中发挥作用,然后再是select操作.
如果where不成立,select操作再不发生.
第2例:
在这个例子中, 1,2两行,先排好序, 在内存中,就是这样的顺序 [2] [1]
再逐行where条件判断,取值.
对比这2张图,分析:
1: where先发挥作用,把需要的行 都给找出
2: 然后再逐行 select
因此, 前者, 最终select时,select@num变量,都是一个值
后者,不断select,不断修改@num的值, 值不断变化.
同时: 使用变量,将会使sql语句的结果不缓存.
0 0
- 巧用变量减少查询
- 减少函数变量的方法
- 巧用数组减少if语句
- 巧用成员指针减少代码重复
- js缓存变量,减少DOM操作开销
- 测试用例的数值代入和减少查询条件方法
- sql查询中尽量减少的使用
- CASE WHEN 减少表查询次数
- 用来减少SQL的查询类库
- 缓存框架Ehcache,减少数据库频繁查询
- ruby on rails 减少查询次数
- 用fragment减少activity
- Reporting Service巧用报表名减少冗余发布
- [面试算法]减少中间变量的面试题
- sql 查询 定义变量
- thinkphp 查询变量
- 减少oracle sql回表次数 提高SQL查询性能
- 减少oracle sql回表次数 提高SQL查询性能
- CSS-float详解
- Scala Learning(2): map, flatMap, filter与For表达式
- html中frameset的详细使用方法
- 机房收费系统--存储过程、视图
- Servlet与Struts action线程安全问题分析
- 巧用变量减少查询
- 第三章第二十八题
- MapView开发学习总结(一)
- jsp中的隐含对象
- The 12th Zhejiang Provincial Collegiate Programming Contest(部分)
- 如何更改页面button的外观?
- FromHandle与Attach。
- 四个有用的Filter
- Mac键盘实现Home, End, Page UP, Page DOWN这几个键