2012-04-18 91 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秒)

...但現在我真的想知道沒關係,哪個表設計正在使用。 困惑