优化大表上的计数SQL查询

时间:2013-12-18 22:47:04

标签: php mysql sql

我现在有一张超过1万个寄存器的表,它们开始运行得很慢。

我有以下代码:

COUNT

$SqlCount = "SELECT tabnews.New_Id
            FROM tabnew WHERE New_Id <> '' AND New_Status = 1";
$QueryCount = mysql_query($SqlCount, $Conn) or die(mysql_error($Conn));
$NumCount = mysql_num_rows($QueryCount);
$recordCount = $NumCount;

分页

if (!$id) $p = 1;
else $p = $id;
$pageSize = 16;
$itemIni = ($pageSize*$p)-$pageSize;
$totalPage = ceil($recordCount/$pageSize);

显示

       $Sql52 = "SELECT New_Id, New_Nome, New_Data, New_Imagem FROM tabnews WHERE New_Status = 1 ORDER BY New_Id DESC LIMIT $itemIni, $pageSize ";
       $Query52 = mysql_query($Sql52, $Conn);
       while($Rs52 = mysql_fetch_array($Query52)){

      // ECHO RESULTS
}

我的数据库:

CREATE TABLE IF NOT EXISTS `tabnews` (
  `New_Id` int(11) NOT NULL AUTO_INCREMENT,
  `Franquia_Id` text NOT NULL,
  `New_Slide` int(2) NOT NULL,
  `Categoria_Id` int(2) NOT NULL,
  `New_Nome` varchar(255) NOT NULL,
  `New_Data` date NOT NULL,
  `New_Imagem` varchar(75) NOT NULL,
  `New_Status` int(11) NOT NULL,
  PRIMARY KEY (`New_Id`),
  KEY `idx_1` (`New_Status`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10490 ;

关于如何让它运行得更快的任何想法?

我有一台运行CENTOS的专用服务器。

2 个答案:

答案 0 :(得分:1)

对于这么小的桌子来说,20秒是非常奇怪的。 我有一个非常相似的表,有近400万行,你的两个SQL语句都需要不到0.002秒。

CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'open',
  `method` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'GET',
  `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `params` text COLLATE utf8_unicode_ci,
  `response` text COLLATE utf8_unicode_ci,
  `executed_by` varchar(50) COLLATE utf8_unicode_ci DEFAULT '',
  `execute_at` datetime DEFAULT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `status` (`status`),
  KEY `modified` (`modified`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3839270 ;

-

SELECT COUNT(id) FROM tasks WHERE status='done';
---> Query took 0.0008 sec

-

SELECT id, status, method, url FROM tasks WHERE status='done' ORDER BY id DESC LIMIT 200, 100;
---> Query took 0.0011 sec

观察:

  • 您应该使用SELECT COUNT(New_Id)...
  • New_id&lt;&gt; ''没有意义。 New_id不能为空或NULL
  • 将New_Status的长度设置为与您存储的值匹配的内容
  • 尝试关闭日志记录:SET GLOBAL general_log ='OFF';
  • 更新您的服务器软件包(特别是MySQL)
  • 它只是数据库的专用服务器吗?
  • 服务器是否运行其他东西? (运行'top'和'uptime'来检查它的状态)

答案 1 :(得分:1)

此:

New_Id <> '' 

这是做什么的?它将 INT 主键中的每一个转换为字符串,以将其与字符串进行比较。为什么与字符串进行比较?根据定义 不能<{1}},省略''条款中的New_Id <> ''