簡體   English   中英

慢MySQL查詢不使用filesort

[英]Slow MySQL Query not using filesort

隨着我的數據庫表變大,我的主頁上的查詢越來越慢。

tablename = tweets_cache rows = 572,327

這是我目前使用的查詢很慢,超過5秒。

SELECT * FROM tweets_cache t WHERE t.province='' AND t.mp='0' ORDER BY t.published DESC LIMIT 50;

如果我取出WHERE或ORDER BY,那么查詢超快0.016秒。

我在tweets_cache表上有以下索引。

PRIMARY
published
mp
category
province
author

所以我不確定為什么它不使用索引,因為mp,provice和發布都有索引? 執行查詢的配置文件顯示它不使用索引對查詢進行排序,並且正在使用非常慢的filesort。

possible_keys = mp,province
Extra = Using where; Using filesort

我嘗試使用“profiles&mp”添加一個新的multie-colum索引。 解釋顯示這個新索引列在“possible_keys”和“key”下,但查詢時間不變,仍然超過5秒。

以下是查詢中的探查器信息的屏幕截圖

奇怪的是,我在我的本地桌面上進行了數據庫轉儲以便進行測試,所以我不會搞砸現場網站。 我本地的相同查詢運行超快,毫秒。 所以我將所有相同的mysql啟動變量從服務器復制到我的本地,以確保沒有可能導致這種情況的設置。 但即便如此,本地查詢運行速度超快,但實時服務器上的查詢超過5秒。

我的數據庫服務器只使用了大約800MB的4GB可用空間。 這是我正在使用的相關my.ini設置

default-storage-engine = MYISAM
max_connections = 800
跳鎖
key_buffer = 512M
max_allowed_pa​​cket = 1M
table_cache = 512
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 128M
#嘗試使用thread_concurrency的CPU數量* 2
thread_concurrency = 8
#默認情況下禁用Federated
跳聯合

key_buffer = 512M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

key_buffer = 512M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

MySQL 5.0.67

CREATE TABLE `tweets_cache` (                                                             
            `id` bigint(11) unsigned NOT NULL default '0',                                          
            `published` int(11) NOT NULL default '0',                                               
            `title` varchar(140) NOT NULL,                                                          
            `category` varchar(50) NOT NULL,                                                        
            `type` varchar(30) NOT NULL,                                                            
            `author` varchar(25) NOT NULL,                                                          
            `author_full` varchar(150) NOT NULL,                                                    
            `hash` varchar(50) NOT NULL,                                                            
            `lastupdate` int(11) NOT NULL default '0',                                              
            `avatar` varchar(120) NOT NULL,                                                         
            `mp` int(1) NOT NULL default '0',                                                       
            `followers` int(10) NOT NULL default '0',                                               
            `province` varchar(2) NOT NULL,                                                         
            `talkback` varchar(15) NOT NULL default '',                                             
            `in_reply_to_status_id` bigint(11) unsigned NOT NULL default '0',                       
            `author_id` int(11) NOT NULL default '0',                                               
            `tracked` tinyint(1) NOT NULL default '0',                                              
            `geo` varchar(25) NOT NULL default '',                                                  
            PRIMARY KEY  (`id`),                                                                    
            KEY `published` (`published`),                                                          
            KEY `mp` (`mp`),                                                                        
            KEY `category` (`category`),                                                            
            KEY `province` (`province`),                                                            
            KEY `author` USING BTREE (`author`),                                                    
            KEY `home` (`province`,`mp`,`published`)                                                
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='InnoDB free: 275456 kB'

我不確定為什么它不使用索引,因為mp,provice和發布都有索引?

MySQL只會在表中使用一個索引。 如果要在同一步驟中執行WHERE和ORDER BY,請創建一個復合索引,其中包含左側的匹配條件和右側的排序條件,例如。 在這種情況下(province, mp, published)

關於ORDER BY優化

嘗試將查詢分成兩部分,這樣兩個索引都可以工作,如:

CREATE TEMPORARY TABLE cache
SELECT -describefields- FROM tweets_cache t WHERE t.province='' AND t.mp='0';

SELECT * FROM cache c ORDER BY c.published DESC LIMIT 50;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM