2012-04-18 85 views
1

我有这样的评论超过400万行的表:需要帮助/工具比较SQL查询

CREATE TABLE `comments` 
(
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `gid` int(11) unsigned NOT NULL DEFAULT '0', 
    `userid` int(6) unsigned DEFAULT NULL, 
    `date` int(11) unsigned DEFAULT NULL, 
    `comment` text NOT NULL, 
    `status` enum('on','alert') NOT NULL DEFAULT 'on', 
    PRIMARY KEY (`id`), 
    KEY `gid_2` (`gid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

现在我想提取文本字段,以降低400 MB和提高性能。像这样:

CREATE TABLE commentstext 
(
    id int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `comment` text NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

但我不确定这是否会更好地执行这种方式。我需要通过使用不同的查询来测试这些情况(也)。迄今为止我的结果差异很大。在0.001 * - 3.321秒之间。我无法通过在phpmyadmin中查询来检查此问题。

是否有更好更简单的方法或工具来比较查询性能?

+0

你能解释一些你认为需要优化的查询吗?显示代码片段也许? – 2012-04-18 18:31:09

+0

http://stackoverflow.com/questions/10215882/mysql-select-from-t1-t2-or-from-t1-join-t2-on – Tom 2012-04-19 15:05:54

+0

查询在这个线程中并不重要。我需要测试不同的数据库结构。我读过Super Smack,SysBench,mybench,但我仍在寻找一种不太复杂的解决方案。 – Tom 2012-04-20 12:50:26

回答

0

这就是我一直在寻找:

SELECT BENCHMARK(1000000000, (
SELECT 
comments.comment 
FROM 
comments 
WHERE 
`gid`=303410 
LIMIT 1 
)); 

(导致34.1612秒) (导致32.2737秒)

SELECT BENCHMARK(1000000000, (
SELECT 
commentstext.comment 
FROM 
commentsindex, 
commentstext 
WHERE 
`gid`=303410 
AND commentsindex.`id` = commentstext.`id` 
LIMIT 1 
)); 

(导致34.1237秒) (导致34.2914秒。 )

SELECT BENCHMARK(1000000000, (
SELECT 
commentstext.comment 
FROM 
commentsindex 
INNER JOIN 
commentstext 
ON commentstext.`id` = commentsindex.`id` 
WHERE 
`gid`=303410 
LIMIT 1 
)); 

(结果32.8471秒) (结果34.7079秒)

...但现在我真的想知道没关系,哪个表设计正在使用。 困惑