首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql:需要提高查询的性能

问MySql:需要提高查询的性能
EN

Stack Overflow用户
提问于 2013-05-08 18:30:26
回答 1查看 138关注 0票数 3

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

我有以下表格

代码语言:javascript
复制
    vb_user

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

++ userid ++ username ++发布++

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

代码语言:javascript
复制
    vb_post

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

++ userid ++日期线++

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

我使用这个查询

代码语言:javascript
复制
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函数,我想不出该怎么做。

但这需要很长时间。对如何提高查询的性能有什么想法吗?

下面是explain的输出

代码语言:javascript
复制
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"

下面是关于这些表的信息

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-08 19:00:06

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

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

其他的看起来都没问题

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16438351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档