1
我在mysql中有一個大表,大約有100萬條記錄。Mysql限制性能
我使用的是在where子句和秩序,所以我不能使用一些類似的代碼AND id > 34000 LIMIT 10
我有我的領域指數WHERE
和LIMIT
和ORDER
但指數並不能幫助不同參數的動態查詢單獨。
我需要一個比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;
如果查詢可以對WHERE和ORDER BY都使用索引,LIMIT可以很快。你可以發佈查詢,架構('SHOW CREATE TABLE
IM在字段中使用指數是'其中限制ORDER'條款,但它不單單幫助,而且由於其動態和表模式是大我不能發佈我的查詢:-s @ arnaud576875 – Hamidreza 2012-07-05 17:01:52
郵政查詢的唯一一個變體,和從模式中剝離不相關的列;)(只需要查看WHERE和ORDER BY子句中使用的列以及索引) – arnaud576875 2012-07-05 17:03:13
回答
問題與1條百萬記錄的表不會是
AND id > 34000 LIMIT 10
或LIMIT 34000, 10
即會高達結構和查詢的其餘部分。 I.E,你需要索引,PK,FK來加快查詢速度,除此之外可能會降低查詢速度,搜索like '%text%'
它會讓你的查詢慢。此外,它是由表格的引擎所以不要指望更改限制10將產生巨大的差異。有幾個工具可以幫助你確定一個更好的查詢,但並不是所有的查詢都是一樣的,所以不要指望「最好的解決方案」,因爲它不存在。
您可以使用顯示
create table
或Describe select ......
或explain
,看看發生了什麼事,或者使用命令benchmark
看到你正在申請對其進行改進編輯功能的大致時間:
一些MySQL 的工具我建議你看看這個程序,這將幫助你完成這部分的性能。
來源
2012-07-05 17:01:15 jcho360
我沒有使用像'like'這樣的低性能查詢%text%' '但我必須在某些查詢中使用'match against'。我最大的問題是,當我需要第200000條記錄時,有幾個字段排序並抵消延遲 – Hamidreza 2012-07-05 17:18:54
@ hamidreza66我知道你不是使用like,但我的意思是你不能有「最好的方式」,因爲有不同的方式來查詢,並且響應時間會有所不同。最重要的是DATABASE的結構和獲得「良好」性能的完整查詢。我給你命名一些工具,這將有助於找到更好的解決方案 – jcho360 2012-07-05 17:22:31
讓我知道這個工具 – Hamidreza 2012-07-06 14:44:16
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/
來源
2012-07-05 16:58:04 arnaud576875
我知道它,但如果查詢是動態的,並且它的posible有1個字段,我應該怎麼做在where子句或20字段中! – Hamidreza 2012-07-05 17:03:56
這個查詢是爲一個搜索表單,並且可以返回所有記錄,並且沒有按id或任何唯一的id排序,我認爲它使用極限偏移的不好方法 – Hamidreza 2012-07-05 17:05:53
相關問題