gpt4 book ai didi

php - MySql:需要提高查询性能

转载 作者:可可西里 更新时间:2023-11-01 08:20:00 25 4
gpt4 key购买 nike

我需要稍微加强一下我的查询,因为它在大型数据库上花费的时间太长了。

我有以下表格

    vb_user

++++++++++++++++++++++++++++++++++

++ 用户 ID++ 用户名++ 帖子++

++++++++++++++++++++++++++++++++++

    vb_post

++++++++++++++++++++++++++

++ 用户 ID++ 日期线++

++++++++++++++++++++++++++

我用这个查询

SELECT VBU.userid AS USER_ID
, VBU.username AS USER_NAME
, COUNT(VBP.userid) AS NUMBER_OF_POSTS_FOR_30_DAYS
, FROM_UNIXTIME(VBU.joindate) as JOIN_DATE
FROM vb_user AS VBU
LEFT JOIN vb_post AS VBP
ON VBP.userid = VBU.userid
WHERE VBU.joindate BETWEEN '__START_DATE__' AND '__END_DATE__'
AND VBP.dateline BETWEEN VBU.joindate AND DATE_ADD(FROM_UNIXTIME(VBU.joindate), INTERVAL 30 DAY)
GROUP BY VBP.userid
ORDER BY NUMBER_OF_POSTS_FOR_30_DAYS DESC"

我必须选择从加入时到 30 天后发帖最多的用户......如果没有 FROM_UNIXTIME 函数,我不知道该怎么做......

但这需要很多时间。关于如何提高查询性能的任何想法?

这是解释的输出

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,VBP,index,userid,threadid_visible_dateline,18,NULL,2968000,"Using where; Using index; Using temporary; Using filesort"
1,SIMPLE,VBU,eq_ref,PRIMARY,PRIMARY,4,vb_copilul.VBP.userid,1,"Using where"

这里是关于表格的信息

Table,"Create Table"
vb_user,"CREATE TABLE `vb_user` (
`userid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL DEFAULT '',
`posts` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`userid`),
KEY `usergroupid` (`usergroupid`),
) ENGINE=MyISAM AUTO_INCREMENT=101076 DEFAULT CHARSET=latin1"

Table,"Create Table"
vb_post,"CREATE TABLE `vb_post` (
`postid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`threadid` int(10) unsigned NOT NULL DEFAULT '0',
`parentid` int(10) unsigned NOT NULL DEFAULT '0',
`username` varchar(100) NOT NULL DEFAULT '',
`userid` int(10) unsigned NOT NULL DEFAULT '0',
`title` varchar(250) NOT NULL DEFAULT '',
`dateline` int(10) unsigned NOT NULL DEFAULT '0',
`pagetext` mediumtext,
`allowsmilie` smallint(6) NOT NULL DEFAULT '0',
`showsignature` smallint(6) NOT NULL DEFAULT '0',
`ipaddress` char(15) NOT NULL DEFAULT '',
`iconid` smallint(5) unsigned NOT NULL DEFAULT '0',
`visible` smallint(6) NOT NULL DEFAULT '0',
`attach` smallint(5) unsigned NOT NULL DEFAULT '0',
`infraction` smallint(5) unsigned NOT NULL DEFAULT '0',
`reportthreadid` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`postid`),
KEY `userid` (`userid`),
KEY `threadid` (`threadid`,`userid`),
KEY `threadid_visible_dateline` (`threadid`,`visible`,`dateline`,`userid`,`postid`),
KEY `dateline` (`dateline`),
KEY `ipaddress` (`ipaddress`)
) ENGINE=MyISAM AUTO_INCREMENT=3009320 DEFAULT CHARSET=latin1"

最佳答案

您可以做两件事来改进查询:

  • 不要将 VBP.datetime 转换为 unix 时间。直接对日期使用 BETWEEN 查询。在您的查询中,服务器必须转换数据库中的所有日期以比较它们,而不是使用 native 类型。如果您总是将 datetime 列用作 unix 时间戳,则将其声明为 Double(我认为?)而不是 DATETIME(或 TIMESTAMP - 无论您选择什么)。这样您也可以加快其他操作。
  • 将索引添加到 datetime 列以确保 between 查询足够快。

一切正常

关于php - MySql:需要提高查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16438351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com