在recent question中,StevieG向我展示了如何解决数据透视表的问题.新的问题是我必须检查数据透视表上的某些条件.让我们进行最后的查询:

SELECT

c.id,

GROUP_CONCAT(if(d.name = 'p1', d.value, NULL)) AS 'p1',

GROUP_CONCAT(if(d.name = 'p2', d.value, NULL)) AS 'p2',

GROUP_CONCAT(if(d.name = 'p3', d.value, NULL)) AS 'p3',

GROUP_CONCAT(if(d.name = 'p4', d.value, NULL)) AS 'p4',

GROUP_CONCAT(if(d.name = 'p5', d.value, NULL)) AS 'p5',

GROUP_CONCAT(if(d.name = 'p6', d.value, NULL)) AS 'p6'

FROM container c

JOIN data d ON c.id = d.container

GROUP BY c.id

显然,我无法添加WHERE子句(例如,如果我想检查p5> 30).我发现了两种方法可以解决此问题.首先是通过在派生表中进行转换:

SELECT * FROM (

SELECT

c.id,

GROUP_CONCAT(if(d.name = 'p1', d.value, NULL)) AS 'p1',

GROUP_CONCAT(if(d.name = 'p2', d.value, NULL)) AS 'p2',

GROUP_CONCAT(if(d.name = 'p3', d.value, NULL)) AS 'p3',

GROUP_CONCAT(if(d.name = 'p4', d.value, NULL)) AS 'p4',

GROUP_CONCAT(if(d.name = 'p5', d.value, NULL)) AS 'p5',

GROUP_CONCAT(if(d.name = 'p6', d.value, NULL)) AS 'p6'

FROM container c

JOIN data d ON c.id = d.container

GROUP BY c.id

) WHERE p5>30

我发现的另一种方法是添加HAVING子句:

SELECT

c.id,

GROUP_CONCAT(if(d.name = 'p1', d.value, NULL)) AS 'p1',

GROUP_CONCAT(if(d.name = 'p2', d.value, NULL)) AS 'p2',

GROUP_CONCAT(if(d.name = 'p3', d.value, NULL)) AS 'p3',

GROUP_CONCAT(if(d.name = 'p4', d.value, NULL)) AS 'p4',

GROUP_CONCAT(if(d.name = 'p5', d.value, NULL)) AS 'p5',

GROUP_CONCAT(if(d.name = 'p6', d.value, NULL)) AS 'p6'

FROM container c

JOIN data d ON c.id = d.container

GROUP BY c.id

HAVING p5>30

问题在于性能.我使用的测试数据库有50.000个条目,但产量可能高达100万.第一个句子(没有检查p5> 30的那个句子)在我的开发计算机(没有缓存)中执行1000个句子需要0’60秒,但是第二个和第三个句子要花5分钟以上的时间才能完成.

我知道有一个不带数据索引的隐式派生表生成,但是我有什么选择来优化它呢?

解决方法:

由于数据(容器,名称)是唯一的,因此您无需使用GROUP_CONCAT.

那这个呢:

SELECT

c.id,

d_p1.value AS 'p1',

d_p2.value AS 'p2',

d_p3.value AS 'p3',

d_p4.value AS 'p4',

d_p5.value AS 'p5'

FROM container AS c

LEFT JOIN data AS d_p1 ON (d_p1.container = c.id AND d_p1.name = 'p1')

LEFT JOIN data AS d_p2 ON (d_p2.container = c.id AND d_p2.name = 'p2')

LEFT JOIN data AS d_p3 ON (d_p3.container = c.id AND d_p3.name = 'p3')

LEFT JOIN data AS d_p4 ON (d_p4.container = c.id AND d_p4.name = 'p4')

LEFT JOIN data AS d_p5 ON (d_p5.container = c.id AND d_p5.name = 'p5')

WHERE d_p5.value > 30

如果数据(容器,名称)上有索引,则查询应在几秒钟内运行.

如果data.name的长度超过几个字符(例如5个字符),则应该使用替代键(整数)代替data.name.

标签:query-optimization,mysql

来源: https://codeday.me/bug/20191127/2074549.html

mysql如何进行数据透视,mysql-如何优化数据透视表的条件检查?相关推荐

  1. mysql存储过程中使用select count(*) into 变量名 from +表+ where条件的用法

    select count(*) into v_count from dual where userid=2; 此语句的意思就是根据where条件查询dual表,得到的行数存入变量v_count中(给变 ...

  2. 无用的“数据”?有用的“大数据”

    "您于14天内到达或途径:'长沙市'.'贵阳市'.'宜宾市'"...... 14亿人,663座城市,960万平方公里,出行信息一码识别,在人海之中将你我精准关联.将出行点滴完整具象 ...

  3. MySQL 单表百万数据记录分页性能优化

      来源:一颗卤蛋 链接:http://www.cnblogs.com/lyroge/p/3837886.html 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Goog ...

  4. mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧

    本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时 ...

  5. MySQL调优(二):数据类型和schema优化,MySQL8.0取消查询缓存的原因

    数据类型和schema优化 数据类型的优化 合理使用范式和反范式 三大范式: 1.表不可分 2.不能存在传递依赖 3.表里其他列的值必须唯一依赖于主键 约定大于规范,没有必要严格遵守范式,以业务为准, ...

  6. mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...

    概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...

  7. MySQL(二)数据类型和schema优化

    数据类型和schema优化 数据类型的优化 更小的通常更好 <高性能MySQL> 应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘.内存和CPU缓 ...

  8. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  9. MySQL数据库性能优化--数据分库分表

    目录 前言 1.什么时候需要分库分表? 1.1.第一次改造 1.2.分库分表的必要性 1.3.第二次改造 2.分库分表应该怎么分? 3.垂直分库会带来哪些问题? 3.1.跨库的关联查询 3.2.分布式 ...

最新文章

  1. Linux BSP非标准HDMI分辨率
  2. 为ListView每个Item上面的按钮添加事件
  3. 22. Kotlin学习笔记 (一) 约定
  4. C++中字符型和整型的关系
  5. 贾扬清演讲实录:一个AI开发者的奇幻漂流
  6. flowable 账号密码加密
  7. 安装默认报表服务器虚拟目录,报表服务器虚拟目录(Reporting Services 配置)
  8. const int *p说明不能修改_随时随地学习C语言之6—const修饰的变量真的不能修改吗?...
  9. Unity寻路的功能总结
  10. bzoj 1610: [Usaco2008 Feb]Line连线游戏
  11. mswinsck.ocx 一个文件丢失或无效_AutoCAD文件修复的10种方法
  12. Tomcat8安装(或卸载重装)
  13. RJ45网线水晶头线序,568A与568B区别,交叉线与直连线区别,10/100M base TX RJ45 接口引脚功能定义
  14. 计算机中.dll文件检查,在电脑中查看并打开dll文件类型的具体方法
  15. MSSqlserver的锁模式介绍
  16. 使用sql server Management Studio(企业管理器)或查询分析器管理数据库
  17. 关于企业软件资质申请流程以及时间规划(一)——软件著作权申请
  18. Mac终端加入IDEA命令
  19. 张勋说:简述球磨机内介质(钢球|钢棒|衬板)运动动力学(图文)
  20. 戒不掉的温柔 (残月

热门文章

  1. 大数据分析的步骤有哪些
  2. linux 汇编语言ldreq,请教一个中断句柄的问题 - ARM技术论坛-ARM嵌入式论坛-人气最火爆ARM学习论坛 - 21ic电子技术开发论坛...
  3. awd赛题的flag是什么意思_写在新年伊始——由新年Flag所想到的
  4. 太极计算机 审计厅,湖北省审计厅举办2010年春节联欢会
  5. java jtree怎么初始化,java – 如何设置JTree“ctrl”选择模式始终启用
  6. 自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)
  7. spark-shell开发wordcount程序
  8. Drools 文档(目录)
  9. CENTOS利用Keepalived构建双主MySQL+双机热备
  10. 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)