首页 >后端开发 >php教程 >MYSQL查询速度特别慢,是不是我的表结构有问题,请大家看一下。

MYSQL查询速度特别慢,是不是我的表结构有问题,请大家看一下。

WBOY
WBOY原创
2016-06-23 14:24:39936浏览

表一,是小说表:
CREATE TABLE IF NOT EXISTS `book` (
  `bid` int(6) unsigned NOT NULL AUTO_INCREMENT, 
  `siteid` smallint(2) NOT NULL DEFAULT '0', 多站点ID
  `catid` smallint(6) NOT NULL,   栏目ID
  `title` char(80) NOT NULL,  标题
  `words` char(20) NOT NULL DEFAULT '0', 字数统计
  `content` text NOT NULL,  简介
  `inputtime` int(11) NOT NULL, 录入时间
  `updatetime` int(11) NOT NULL, 更新时间
  `username` varchar(40) NOT NULL, 用户名
  `author` varchar(100) NOT NULL, 作者
  `letter` char(5) NOT NULL, 首字母
  `thumb` varchar(200) NOT NULL, 缩略图
  `url` varchar(200) NOT NULL, 静态地址
  `keywords` varchar(200) NOT NULL,关键字
  `passed` tinyint(1) NOT NULL DEFAULT '0',连载情况
  `status` tinyint(2) NOT NULL DEFAULT '99',审核
  `posid` tinyint(1) NOT NULL DEFAULT '0',推荐ID
  PRIMARY KEY (`bid`),
  KEY `siteid` (`siteid`,`passed`,`catid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

表二,章节表
CREATE TABLE IF NOT EXISTS `book_capital` (
  `cid` int(8) unsigned NOT NULL AUTO_INCREMENT,
  `bid` int(6) unsigned NOT NULL,  书ID
  `listorder` int(8) NOT NULL DEFAULT '0',排序
  `title` varchar(180) NOT NULL,章节标题
  `content` text NOT NULL,章节内容
  `updatetime` int(11) NOT NULL,更新时间
  `url` varchar(200) NOT NULL,章节地址
  PRIMARY KEY (`cid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=38065 ;


现在不知道是什么问题,查询速度特别慢,请高手看看是不是表建的不对。



回复讨论(解决方案)

sql 指令的问题

public function lists($data) {
$siteid = $data['siteid'] ? intval($data['siteid']) : get_siteid();
$catid = intval($data['catid']);
$passed = $data['passed']==''?"3":$data['passed'];
$posid = intval($data['posid']);
$catidin = $data['catidin'];
//echo $data['letter'];
//echo ord($data['letter']);
if(ord($data['letter'])>60){
$letter=$data['letter'];
}
//$letter = $data['letter']==0?"":$data['letter'];
if(isset($data['where'])) {$sql = " and ".$data['where'];} 
$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
if ($siteid) $where .= " `siteid`='".$siteid."'";
if ($passed==0 or $passed==1) $where .= " and `passed`='".$passed."'";
if ($posid) $where .= " and `posid`='".$posid."'";
if ($catidin) $where .= " and catid in('".$catidin."')";
if ($catid) $where .= " and `catid`='".$catid."'";
if ($letter) $where .= " and `letter`='".$letter."'";
$where .= ' AND `status`=\'99\''.$sql.$thumb;
$order = $data['order'];
return $this->db->select($where, '*', $data['limit'], $order);
}


这是查询的标签代码,这里有问题吗。

是否有问题,需要看到完整的查询指令才知道

第一个是热点内容查询,是和点击表关联的查询指令:
select a.bid,a.title,a.author,a.content,a.updatetime,a.catid,a.url, a.posid, b.bid,b.hits ,b.hits from book a,book_hits b where a.bid=b.bid and a.posid=2 order by hits desc LIMIT 1

点击表:
CREATE TABLE IF NOT EXISTS `book_hits` (
  `catid` int(6) NOT NULL,
  `bid` int(6) unsigned NOT NULL,
  `hits` int(6) NOT NULL DEFAULT '0',
  `day` int(6) DEFAULT '0',
  `week` int(6) DEFAULT '0',
  `month` int(6) DEFAULT '0',
  `updatetime` int(11) NOT NULL,
  PRIMARY KEY (`bid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


第二个是单表查询的:select * from book where `siteid`='1' and `posid`='1' and `catid`='22' AND `status`='99' AND thumb != '' order by bid desc limit 0,10

整个页面就这两种查询。打开首页差不多要20秒才行。

是不是?量大?

在查询器里在你的查询语句前面加explain
例如
EXPLAIN select * from user where user='999'
具体相关解释看这个
http://www.blogjava.net/persister/archive/2008/10/27/236813.html

desc  select * from …分析下查询 慢的地方,合理加上索引

根据查询的需求,表加上索引

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn