2012-07-05 63 views
1

我在mysql中有一個大表,大約有100萬條記錄。Mysql限制性能

我使用的是在where子句和秩序,所以我不能使用一些類似的代碼AND id > 34000 LIMIT 10

我有我的領域指數WHERELIMITORDER但指數並不能幫助不同參數的動態查詢單獨。

我需要一個比LIMIT 34000, 10更好的方法,有什麼辦法來解決偏移延遲?

我把我的表架構,但我只複製更多可用的領域沒有任何索引,因爲我使用動態查詢。

CREATE TABLE IF NOT EXISTS `p_apartmentbuy` (
    `property_id` mediumint(8) unsigned NOT NULL, 
    `dateadd` int(10) unsigned NOT NULL, 
    `sqm` smallint(5) unsigned NOT NULL, 
    `sqmland` smallint(5) unsigned NOT NULL, 
    `age` tinyint(2) unsigned NOT NULL, 
    `price` bigint(12) unsigned NOT NULL, 
    `pricemeter` int(11) unsigned NOT NULL, 
    `floortotal` tinyint(3) unsigned NOT NULL, 
    `floorno` tinyint(3) unsigned NOT NULL, 
    `unittotal` smallint(4) unsigned NOT NULL, 
    `unitthisfloor` tinyint(3) unsigned NOT NULL, 
    `room` tinyint(1) unsigned NOT NULL, 
    `parking` tinyint(1) unsigned NOT NULL, 
    `renovate` tinyint(1) unsigned NOT NULL, 
    `address` varchar(255) COLLATE utf8_general_ci NOT NULL, 
    `describe` varchar(500) COLLATE utf8_general_ci NOT NULL, 
    `featured` tinyint(1) unsigned NOT NULL, 
    `l_location_id` smallint(5) unsigned NOT NULL, 
    `l_city_id` smallint(4) unsigned NOT NULL, 
    `pf_furnished_id` tinyint(2) unsigned NOT NULL, 
    PRIMARY KEY (`property_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 
+0

如果查詢可以對WHERE和ORDER BY都使用索引,LIMIT可以很快。你可以發佈查詢,架構('SHOW CREATE TABLE

')和'EXPLAIN '輸出嗎? – arnaud576875 2012-07-05 16:54:16

+0

IM在字段中使用指數是'其中限制ORDER'條款,但它不單單幫助,而且由於其動態和表模式是大我不能發佈我的查詢:-s @ arnaud576875 – Hamidreza 2012-07-05 17:01:52

+0

郵政查詢的唯一一個變體,和從模式中剝離不相關的列;)(只需要查看WHERE和ORDER BY子句中使用的列以及索引) – arnaud576875 2012-07-05 17:03:13

回答

2

問題與1條百萬記錄的表不會是AND id > 34000 LIMIT 10LIMIT 34000, 10即會高達結構和查詢的其餘部分。 I.E,你需要索引,PK,FK來加快查詢速度,除此之外可能會降低查詢速度,搜索like '%text%'它會讓你的查詢慢。此外,它是由表格的引擎

所以不要指望更改限制10將產生巨大的差異。有幾個工具可以幫助你確定一個更好的查詢,但並不是所有的查詢都是一樣的,所以不要指望「最好的解決方案」,因爲它不存在。

您可以使用顯示create tableDescribe select ......explain,看看發生了什麼事,或者使用命令benchmark看到你正在申請對其進行改進

編輯功能的大致時間:

一些MySQL 的工具我建議你看看這個程序,這將幫助你完成這部分的性能。

  • Mysqlslap(這就像基準,但你可以定製更多的結果)。 (測試CPU性能,I/O性能,互斥量爭用,內存速度,數據庫性能)。
  • Mysqltuner(通過這個你可以分析一般統計數據,存儲引擎統計數據,性能指標)。
  • mk-query-profiler(執行SQL語句的分析)。
  • mysqldumpslow(很高興知道女巫查詢導致問題)。
+0

我沒有使用像'like'這樣的低性能查詢%text%' '但我必須在某些查詢中使用'match against'。我最大的問題是,當我需要第200000條記錄時,有幾個字段排序並抵消延遲 – Hamidreza 2012-07-05 17:18:54

+0

@ hamidreza66我知道你不是使用like,但我的意思是你不能有「最好的方式」,因爲有不同的方式來查詢,並且響應時間會有所不同。最重要的是DATABASE的結構和獲得「良好」性能的完整查詢。我給你命名一些工具,這將有助於找到更好的解決方案 – jcho360 2012-07-05 17:22:31

+0

讓我知道這個工具 – Hamidreza 2012-07-06 14:44:16

1

MySQL是能夠優化LIMIT條款(即,僅掃描/在由LIMIT指定的範圍評價中的行),如果它是能夠只使用索引來找到行匹配查詢。

對於像SELECT * FROM users WHERE active = 1 ORDER BY created_at這樣的查詢,在(active,created_at)上添加和索引就足夠了。

http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

+0

我知道它,但如果查詢是動態的,並且它的posible有1個字段,我應該怎麼做在where子句或20字段中! – Hamidreza 2012-07-05 17:03:56

+0

這個查詢是爲一個搜索表單,並且可以返回所有記錄,並且沒有按id或任何唯一的id排序,我認爲它使用極限偏移的不好方法 – Hamidreza 2012-07-05 17:05:53