Mysql在1中进行3次查询并提高性能

Mysql在1中进行3次查询并提高性能,mysql,performance,join,Mysql,Performance,Join,我试图创建一个报告并运行4个查询,但性能太差了 我用了两张桌子 这个有2500件 CREATE TABLE `bolt_accounts` ( `id` int(11) NOT NULL, `slug` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `datecreated` datetime NOT NULL, `datechanged` datetime NOT NULL, `datepublish` datetime DE

我试图创建一个报告并运行4个查询,但性能太差了

我用了两张桌子

这个有2500件

CREATE TABLE `bolt_accounts` (
  `id` int(11) NOT NULL,
  `slug` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `datecreated` datetime NOT NULL,
  `datechanged` datetime NOT NULL,
  `datepublish` datetime DEFAULT NULL,
  `datedepublish` datetime DEFAULT NULL,
  `username` varchar(32) COLLATE utf8_unicode_ci DEFAULT '',
  `ownerid` int(11) DEFAULT NULL,
  `status` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `templatefields` longtext COLLATE utf8_unicode_ci COMMENT '(DC2Type:json_array)',
  `managerid` varchar(128) COLLATE utf8_unicode_ci DEFAULT '',
  `parentid` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `name` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `qualify` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `regdate` date DEFAULT NULL,
  `city` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `phone` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `passhash` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `cookie` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `resettoken` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `block` tinyint(1) NOT NULL DEFAULT '0',
  `blocksms` tinyint(1) NOT NULL DEFAULT '0',
  `birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE `bolt_accounts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `IDX_9C703491989D9B62` (`slug`),
  ADD KEY `IDX_9C703491AFBA6FD8` (`datecreated`),
  ADD KEY `IDX_9C703491BE74E59A` (`datechanged`),
  ADD KEY `IDX_9C703491A5131421` (`datepublish`),
  ADD KEY `IDX_9C703491B7805520` (`datedepublish`),
  ADD KEY `IDX_9C7034917B00651C` (`status`),
  ADD KEY `IDX_9C703491C13A5CC2` (`managerid`),
  ADD KEY `IDX_9C703491856A684C` (`parentid`(255)),
  ADD KEY `IDX_9C7034911E6AC3AE` (`regdate`),
  ADD KEY `IDX_9C7034914709B432` (`birthday`);
CREATE TABLE `bolt_statistics` (
  `id` int(11) NOT NULL,
  `slug` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `datecreated` datetime NOT NULL,
  `datechanged` datetime NOT NULL,
  `datepublish` datetime DEFAULT NULL,
  `datedepublish` datetime DEFAULT NULL,
  `username` varchar(32) COLLATE utf8_unicode_ci DEFAULT '',
  `ownerid` int(11) DEFAULT NULL,
  `status` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `templatefields` longtext COLLATE utf8_unicode_ci COMMENT '(DC2Type:json_array)',
  `managerid` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `statdate` datetime DEFAULT NULL,
  `lopv` double NOT NULL DEFAULT '0',
  `gope` double NOT NULL DEFAULT '0',
  `gopv` double NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `bolt_statistics`
  ADD PRIMARY KEY (`id`),
  ADD KEY `IDX_BE38DFD2989D9B62` (`slug`),
  ADD KEY `IDX_BE38DFD2AFBA6FD8` (`datecreated`),
  ADD KEY `IDX_BE38DFD2BE74E59A` (`datechanged`),
  ADD KEY `IDX_BE38DFD2A5131421` (`datepublish`),
  ADD KEY `IDX_BE38DFD2B7805520` (`datedepublish`),
  ADD KEY `IDX_BE38DFD27B00651C` (`status`),
  ADD KEY `IDX_BE38DFD2C13A5CC2` (`managerid`(255));
另一个是所有的统计数据,里面有超过140万个项目

CREATE TABLE `bolt_accounts` (
  `id` int(11) NOT NULL,
  `slug` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `datecreated` datetime NOT NULL,
  `datechanged` datetime NOT NULL,
  `datepublish` datetime DEFAULT NULL,
  `datedepublish` datetime DEFAULT NULL,
  `username` varchar(32) COLLATE utf8_unicode_ci DEFAULT '',
  `ownerid` int(11) DEFAULT NULL,
  `status` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `templatefields` longtext COLLATE utf8_unicode_ci COMMENT '(DC2Type:json_array)',
  `managerid` varchar(128) COLLATE utf8_unicode_ci DEFAULT '',
  `parentid` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `name` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `qualify` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `regdate` date DEFAULT NULL,
  `city` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `phone` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `passhash` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `cookie` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `resettoken` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `block` tinyint(1) NOT NULL DEFAULT '0',
  `blocksms` tinyint(1) NOT NULL DEFAULT '0',
  `birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE `bolt_accounts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `IDX_9C703491989D9B62` (`slug`),
  ADD KEY `IDX_9C703491AFBA6FD8` (`datecreated`),
  ADD KEY `IDX_9C703491BE74E59A` (`datechanged`),
  ADD KEY `IDX_9C703491A5131421` (`datepublish`),
  ADD KEY `IDX_9C703491B7805520` (`datedepublish`),
  ADD KEY `IDX_9C7034917B00651C` (`status`),
  ADD KEY `IDX_9C703491C13A5CC2` (`managerid`),
  ADD KEY `IDX_9C703491856A684C` (`parentid`(255)),
  ADD KEY `IDX_9C7034911E6AC3AE` (`regdate`),
  ADD KEY `IDX_9C7034914709B432` (`birthday`);
CREATE TABLE `bolt_statistics` (
  `id` int(11) NOT NULL,
  `slug` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `datecreated` datetime NOT NULL,
  `datechanged` datetime NOT NULL,
  `datepublish` datetime DEFAULT NULL,
  `datedepublish` datetime DEFAULT NULL,
  `username` varchar(32) COLLATE utf8_unicode_ci DEFAULT '',
  `ownerid` int(11) DEFAULT NULL,
  `status` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `templatefields` longtext COLLATE utf8_unicode_ci COMMENT '(DC2Type:json_array)',
  `managerid` varchar(256) COLLATE utf8_unicode_ci DEFAULT '',
  `statdate` datetime DEFAULT NULL,
  `lopv` double NOT NULL DEFAULT '0',
  `gope` double NOT NULL DEFAULT '0',
  `gopv` double NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `bolt_statistics`
  ADD PRIMARY KEY (`id`),
  ADD KEY `IDX_BE38DFD2989D9B62` (`slug`),
  ADD KEY `IDX_BE38DFD2AFBA6FD8` (`datecreated`),
  ADD KEY `IDX_BE38DFD2BE74E59A` (`datechanged`),
  ADD KEY `IDX_BE38DFD2A5131421` (`datepublish`),
  ADD KEY `IDX_BE38DFD2B7805520` (`datedepublish`),
  ADD KEY `IDX_BE38DFD27B00651C` (`status`),
  ADD KEY `IDX_BE38DFD2C13A5CC2` (`managerid`(255));
所以问题是,当我将这些表连接在一起时,性能会变得很低

SELECT ba.managerid,name,replace(phone,'+','') as phone,passhash, date_format(ba.datepublish,'%d.%m.%Y %H:%i') as datepublish, max(bs.lopv) as lopv, max(bs.gopv) as gopv 
FROM bolt_accounts ba 
LEFT JOIN bolt_statistics bs ON ba.managerid=bs.managerid 
WHERE (parentid='007-645930') 
AND (date(ba.datechanged)=('2018-01-06')) 
AND (date(bs.datecreated)=('2018-01-06')) 
GROUP BY ba.managerid 
ORDER BY gopv desc 
此查询将运行360-450ms~0,3秒。。 它将返回parentid=007-645930的所有ManagerID 诸如此类的事情:

managerid
007-663360
007-677590
007-697191
007-1526400
007-1155884
007-1842169
077-1564660
007-1883072
007-777143
007-1865946
007-1875083
007-1753407
007-1322124
007-1100631
007-1603795
007-1171656
007-1890892
007-1166247
007-1564611
007-1882959
007-1145375
007-1878383
007-1128857
007-1762655
007-1346877
007-1714252
007-1709538
007-1319044
007-1698517
007-1316756
007-1679094
007-1298984
007-1905146
007-1675451
007-1287166
007-1899632
007-1629224
007-1190862
007-1894824
007-1616741
007-1171665
007-1894330
然后从该列表中获取1个id,并运行3个查询

SELECT max(s.lopv) as lopv, max(s.gopv) as gopv 
FROM bolt_statistics s WHERE (managerid='007-663360') 
AND (datecreated between DATE_FORMAT('2018-01-06' - INTERVAL 1 MONTH,'%Y-%m-28 23:00:00') and DATE_FORMAT(LAST_DAY('2018-01-06' - INTERVAL 1 MONTH),'%Y-%m-%d 23:59:59'))
执行时间20-25ms

SELECT max(s.lopv) as lopv, max(s.gopv) as gopv 
FROM bolt_statistics s 
WHERE (managerid='007-663360') 
AND (date(datecreated) = date('2018-01-06' -INTERVAL 1 day))
执行时间15-20ms

SELECT max(s.lopv) as lopv, max(s.gopv) as gopv 
FROM bolt_statistics s 
WHERE (managerid='007-663360') 
AND (date(datecreated) = date('2018-01-06' -INTERVAL 2 day))
执行时间15-20ms

SELECT max(s.lopv) as lopv, max(s.gopv) as gopv 
FROM bolt_statistics s 
WHERE (managerid='007-663360') 
AND (date(datecreated) = date('2018-01-06' -INTERVAL 2 day))
当所有执行结束时,呈现php报告需要1.5秒(1500毫秒)

我知道,我不太擅长mysql查询;))但我想知道,如何提高该查询的性能

如果我将所有这些查询合并到1中会更快吗?

这些字段真的需要完整的256字符吗?将它们更改为一个合理的数字,然后去掉
ADD KEY IDX_BE38DFD2C13A5CC2(managerid(255))
等上的前缀(前缀索引通常是无用的)

不要隐藏函数中的列(
date(ba.datechanged)
)。相反:

AND ba.datechanged >= '2018-01-06' - INTERVAL 2 DAY
AND ba.datechanged  < '2018-01-06' - INTERVAL 3 DAY
和ba.datechanged>=“2018-01-06”-间隔2天
英国航空公司日期变更<'2018-01-06'-间隔3天
注意:无论
datechanged
是什么数据类型--
DATE
DATETIME
DATETIME(6)
TIMESTAMP
,上述模式都可以正常工作。优化器可以使用索引,例如

之后,使用复合
索引(managerid,datecreated)
显著提高性能

使用派生表,而不是
左联接
分组依据
。这可能会大大提高速度

什么是
状态
?为什么
VARCHAR(32)
?如果它是一个简单的、低基数的值,不要单独索引它;该索引将不会被使用


(可能还有更多提示,但这应该可以让您开始了。)

您有很多单列索引。复杂查询需要复合/复合索引才能高效运行。关于单列索引添加键
IDX_be38dfd29d9b62
slug
),添加键
IDX_BE38DFD2AFBA6FD8
datecreated
),添加键
IDX_BE38DFD2BE74E59A
datechanged
),ADD KEY
IDX_BE38DFD2A5131421
datepublish
),ADD KEY
IDX_BE38DFD2B7805520
datedepublish
),ADD KEY
IDX_BE38DFD27B00651C
状态
),这类索引是通过螺栓cms控制的,所以我无法删除它们;(关于复合索引呢,我不明白?好的,我得到了复合索引,所以问题是:有一个复杂的索引(managerid,datecreated)是一个好主意吗?这是一个好“主意”如果它能提高性能。@PaulSpiegel Thx man.添加复合\复合索引帮助我将性能提高了3倍。Mb我忘了提到,这些字段我不使用,它们是由Bolt CMS自动创建的:id、slug、用户名、ownerid、状态、templatefields。我已经删除了带前缀的索引键,并添加了复合字段第一个。现在第一个查询运行了100毫秒,速度比以前快了。关于“不要在函数中隐藏列(date(ba.datechanged))”datechanged是datetime字段,%Y-%m-%d 00:00:00。所以我不能在没有函数日期(datechanged)的情况下只使用“2018-01-07”文本
“2018-01-07”
日期
日期时间
进行比较时有效(请注意,在我给出的示例中,我并不在意;现在就更新它。)