楼主: fuiou_cary

[原创] 【讨论】多字段or连接查询如何优化!

[复制链接]
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
11#
 楼主| 发表于 2014-8-26 11:30 | 只看该作者
mchdba 发表于 2014-8-22 17:58
可以写成 in 的方式。

or的字段不一样啊,写不了in啊

使用道具 举报

回复
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
12#
发表于 2014-8-26 11:31 | 只看该作者
fuiou_cary 发表于 2014-8-26 12:30
or的字段不一样啊,写不了in啊

把or换成多个union all语句。

使用道具 举报

回复
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
13#
 楼主| 发表于 2014-8-26 11:33 | 只看该作者
云卷江南 发表于 2014-8-25 08:54
fas_dt 这个必须有索引。不然玩不转!

fas_dt是有索引的,但是属于范围检索了,括号里面的or连接都是=定值,选择性比较高,都走or字段的索引了,效率比所有or字段拆开单独select的总和还要慢,纠结

使用道具 举报

回复
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
14#
 楼主| 发表于 2014-8-26 11:33 | 只看该作者
云卷江南 发表于 2014-8-25 08:54
当然得看数据库量

数据量2KW

使用道具 举报

回复
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
15#
 楼主| 发表于 2014-8-26 11:37 | 只看该作者
本帖最后由 fuiou_cary 于 2014-8-26 11:38 编辑
digdeep126 发表于 2014-8-25 10:07
把执行计划贴出来看看。

日期是主键的一个字段,这里是范围查询最后key就没有用,剩下的都是or字段的索引调用
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: T_08
         type: index_merge
possible_keys: PRIMARY,i_fas_txn_log_a,i_fas_txn_log_b,i_fas_txn_log_c,i_fas_txn_log_d,i_fas_txn_log_e,i_fas_txn_log_f,i_fas_txn_log_g
          key: i_fas_txn_log_e,i_fas_txn_log_f,i_fas_txn_log_c,i_fas_txn_log_d,i_fas_txn_log_g,i_fas_txn_log_b,i_fas_txn_log_a
      key_len: 26,26,26,26,26,26,26
          ref: NULL
         rows: 21192
        Extra: Using sort_union(i_fas_txn_log_e,i_fas_txn_log_f,i_fas_txn_log_c,i_fas_txn_log_d,i_fas_txn_log_g,i_fas_txn_log_b,i_fas_txn_log_a); Using where with pushed condition
1 row in set (0.01 sec)

使用道具 举报

回复
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
16#
 楼主| 发表于 2014-8-26 11:51 | 只看该作者
mchdba 发表于 2014-8-26 11:31
把or换成多个union all语句。

换成union没有去重啊,我有几个or连接的字段有时候会同时有值

使用道具 举报

回复
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
17#
发表于 2014-8-26 12:27 | 只看该作者
本帖最后由 digdeep126 于 2014-8-26 12:28 编辑
fuiou_cary 发表于 2014-8-26 11:37
日期是主键的一个字段,这里是范围查询最后key就没有用,剩下的都是or字段的索引调用
***************** ...

fas_dt between '20140820' and '20140822'

fas_dt 因为是复合主键的一部分,如果不是复合主键的第一个字段的话,那么上面的条件是无法使用索引的。

不知道你复合主键是哪几个字段

使用道具 举报

回复
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
18#
发表于 2014-8-26 12:30 | 只看该作者
看你这个查询语句,怎么感觉你表的设计是不是不太合理?

使用道具 举报

回复
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
19#
发表于 2014-8-26 12:55 | 只看该作者
fuiou_cary 发表于 2014-8-26 12:51
换成union没有去重啊,我有几个or连接的字段有时候会同时有值

如果要去重的功效,就直接用union 不要用union all就可以了。

使用道具 举报

回复
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
20#
 楼主| 发表于 2014-8-26 13:53 | 只看该作者
digdeep126 发表于 2014-8-26 12:27
fas_dt between '20140820' and '20140822'

fas_dt 因为是复合主键的一部分,如果不是复合主键的第一个 ...

表结构没办法了,遗留问题现在没法改,fas_dt是主键的第一字段,如果是=某天的日期才会用,没有后面的选择性高,主键没有用,15#执行计划

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表