- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要产生一些数字,我设计了一个查询来获得我的“客户”想要的结果。该查询基于包含一百万条记录的表。我通常使用 MariaDB,大约 7 秒内就能得到结果。这个执行时间非常合适,但我希望再次优化以提高我的技能。经过一番研究,我发现一些帖子说“MySQL 很好,但不适用于> 1M 记录的表,你必须打开其他东西” PostgreSQL 已被多次引用。所以我安装了 PostgreSQL,并复制了我的表、索引和数据。我执行了相同的查询,大约 12 秒内就得到了结果
我对 PostgreSQL 了解较少,我认为我没有使用该语言固有的特殊性。所以现在我仍然使用 MariaDB。您有改善执行时间的想法吗?
这是我的查询:
select categorie.cat
,dhu_type.type
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2013-01-01' and '2013-12-31'
THEN dhu.id
END )
) AS "2013"
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2014-01-01' and '2014-12-31'
THEN dhu.id
END )
) AS "2014"
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2015-01-01' and '2015-12-31'
THEN dhu.id
END )
) AS "2015"
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2016-01-01' and '2016-12-31'
THEN dhu.id
END )
) AS "2016"
from dhu
inner join dhu_type on dhu.type_id = dhu_type.id
inner join patient on dhu.patient_id=patient.id
inner join fa on patient.id = fa.patient_id
inner join categorie on categorie.id = fa.cat_id
group by cat,dhu_type.type
我用图表来完成我的问题
这里创建表:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
CREATE TABLE IF NOT EXISTS `categorie` (
`id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`cat` varchar(50) NOT NULL DEFAULT 'neonat',
PRIMARY KEY (`id`,`cat`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `cp` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`cp` varchar(5) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `cp` (`cp`)
) ENGINE=InnoDB AUTO_INCREMENT=4096 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `dhu` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`patient_id` int(10) unsigned NOT NULL,
`date` date NOT NULL,
`type_id` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_dhu_patient` (`patient_id`),
KEY `FK_dhu_dhu_type` (`type_id`),
CONSTRAINT `FK_dhu_dhu_type` FOREIGN KEY (`type_id`) REFERENCES `dhu_type` (`id`),
CONSTRAINT `FK_dhu_patient` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=953590 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `dhu_import` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`noip` bigint(10) unsigned zerofill NOT NULL,
`date` date NOT NULL,
`cp` varchar(5) NOT NULL,
`type` varchar(4) NOT NULL,
PRIMARY KEY (`id`),
KEY `noip` (`noip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `dhu_type` (
`id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(4) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `type` (`type`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `dpt` (
`dpt` tinyint(3) unsigned DEFAULT NULL,
`abrev` char(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fa` (
`patient_id` int(10) unsigned NOT NULL,
`cat_id` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`patient_id`,`cat_id`),
KEY `idx_cat_id_pat_id` (`cat_id`,`patient_id`),
CONSTRAINT `FK_fa_patient` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`),
CONSTRAINT `FK_fa_categorie` FOREIGN KEY (`cat_id`) REFERENCES `categorie` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fa_import` (
`noip` bigint(10) unsigned zerofill NOT NULL,
`cat` varchar(50) NOT NULL,
PRIMARY KEY (`noip`,`cat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
CREATE TABLE IF NOT EXISTS `patient` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`noip` bigint(10) unsigned zerofill NOT NULL,
`cp_id` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_patient_cp` (`cp_id`),
CONSTRAINT `FK_patient_cp` FOREIGN KEY (`cp_id`) REFERENCES `cp` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=262141 DEFAULT CHARSET=utf8;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
这里进行了改进性能的修改(选择categorie.id而不是categorie.cat):
这是我找到的最好的查询,感谢@RickJames 和@BillKarwin
select categorie.cat
,dhu_type.`type`
,t.`2013`
,t.`2014`
,t.`2015`
,t.`2016`
from ( select fa.cat_id as catid
,dhu.type_id typid
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2013-01-01' and '2013-12-31'
THEN dhu.id
END )
) AS "2013"
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2014-01-01' and '2014-12-31'
THEN dhu.id
END )
) AS "2014"
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2015-01-01' and '2015-12-31'
THEN dhu.id
END )
) AS "2015"
,COUNT(DISTINCT(
CASE WHEN dhu.date between '2016-01-01' and '2016-12-31'
THEN dhu.id
END )
) AS "2016"
from dhu
inner join patient on dhu.patient_id=patient.id
inner join fa on patient.id = fa.patient_id
group by fa.cat_id, dhu.type_id ) t
inner join categorie on t.catid = categorie.id
inner join dhu_type on t.typid = dhu_type.id
order by categorie.cat,dhu_type.`type`
最佳答案
MySQL 可以很好地处理十亿行的表。
任何数据库引擎都受到磁盘速度和用于缓存的 RAM 的大小的影响。
教科书说要规范化所有内容,但我建议 4 字符 type
不值得规范化。 5 字符 cp
也是如此。
除非您确实希望输出行全部为零,否则请在 之前添加此
。WHERE dhu.date between '2016-01-01' 和 '2016-12-31'
分组依据
听从我的建议 here关于多:多模式设计 (fa
)。这可能会加快 MySQL 的查询速度。 (我不知道同样的原则是否适用于 Postgres。)
关于mysql - MariaDB/PostgreSQL - 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45956787/
我在 CentOS 6.4 上运行 MariaDB (10.0.2-MariaDB) 并且想使用 MariaDB 的 CONNECT-Engine 从一些日志文件中读取。由于日志文件很大,我用两个 C
MariaDB 是否支持嵌套事务(不是保存点)? 我希望能够在存储过程中使用嵌套事务。目前在 MySQL 中,我将一个参数“useTransaction”传递给每个存储过程,它控制我是否在该存储过程的
MariaDb 的默认端口是什么? 我是编程新手。我正在创建我的第一个连接到 MariaDB 的 Java 应用程序。我需要指定数据库端口。 最佳答案 Mariadb 的默认端口是 3306。 它与
ubuntu:~$ sudo apt-get install mariadb-server Reading package lists... Done Building dependency tr
我在Ubuntu 18.04上使用的是Mariadb 10.4.10,工具客户端是DBeaver 6.2.5 我想充分利用 Mariadb 中的约束检查功能来确保数据完整性,因为它是从 10.2.1
当我在 phpmyadmin 中运行这个 sql 时 SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE; 表明 @@SQL_MODE STRICT_TRANS_TABLES,E
我正在尝试使用 MariaDB 10.1.12 的联合引擎来创建基于远程数据库中的表的表。关注MariaDB instructions关于如何使用 FederatedX 实现,在数据库 db1 中我创
我在该数据库中有此列,其中包含空格键,我想更改它。 ALTER TABLE . CHANGE COLUMN `Anzahl Personen` AnzahlPersonen int(11); 在命令行
我正在尝试安装 maria db 并遇到以下问题。 [root@localhost ~]# service mysqld start Redirecting to /bin/systemctl sta
我已经基于 mariadb:10.1 构建了一个图像这基本上添加了一个新的 cluster.conf但是在第一个节点开始成功工作后,在第二个节点上面临以下错误。有人可以帮我在这里调试吗? 错误日志尾部
我已阅读 the docs用于 MariaDB REGEX_REPLACE但无法让我的查询工作。我将链接存储在一列中,link并想更改链接的结尾: 来自 www.example.com/至 www.e
我在 MariaDB 的 ColumnStore 上发现的每一项分析都声称它使用的磁盘空间比 InnoDB 等常规引擎少,例如:https://www.percona.com/blog/2017/03
如何在 MariaDB 中重置密码?我使用 Windows 而不是 Linux。谁知道如何重置我的 MySQL MariaDB 密码?我尝试在 Google 上搜索但没有帮助。 最佳答案 我遇到了同样
我正在尝试将 Quarkus 与 MariaDB 图像一起用于测试。 使用 mvn integration-test 启动测试时,我得到以下信息: Unable to start devservice
我正在尝试更新存储在 MariaDB 的 json 列中的数据(libmysql 版本 - 5.6.43,服务器:10.3.34-MariaDB-cll-lve - MariaDB 服务器)。 我的数
我有一个使用 MariaDB 中的表定义的多对多关系。我正在尝试将 Entity Framework Core 中的导航属性用于相关实体,但它们没有水合。 roles | role_id | role
Entity Framework Core 是否支持 MariaDB? 我看到它不在 supported providers 的列表中,但 MySQL 是。也许 MySQL 提供程序会针对 Maria
我在 MariaDb (10.4.10-MariaDB-1:10.4.10+maria~bionic) 中有一个巨大的表,我正在使用添加一个新列 alter table Appointment add
有没有一种方法可以监听 MySQL/MariaDB 中的数据库更改,就像您可以跟踪 MongoDB oplog 一样?我在网上找不到关于此的信息。也许它只适用于 Postgres 而不适用于 MySQ
我刚刚在 Centos 7 中安装了 MariaDB 10.3 数据库服务器。 一切顺利,但在执行“systemctl status mariadb”命令时。这是完整的输出: root@vps [/e
我是一名优秀的程序员,十分优秀!