2014-06-21 43 views
0

限制性能下面的SQL查詢中的100秒的平均持續時間:MySQL的 - ORDER BY和大表

SELECT id FROM members WHERE boolean_deleted = 0 ORDER BY company_name ASC LIMIT 3045700, 25 

表有記錄。

索引設置爲boolean_deleted和company_name列。

如何優化此SQL查詢?

說明:

id: 1 
select_type: SIMPLE 
table: members 
type: range 
possible_keys: boolean_deleted 
key: boolean_deleted 
key_len: 1 
ref: 
rows: 3045758 
Extra: Using where; Using file sort 

表結構:

-- ---------------------------- 
-- Table structure for `members` 
-- ---------------------------- 
DROP TABLE IF EXISTS `members`; 
CREATE TABLE `members` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `creator_id` int(11) UNSIGNED NOT NULL, 
    `number` varchar(255) DEFAULT NULL, 
    `type` enum('Zakelijk','Prive','Onbekend') NOT NULL DEFAULT 'Onbekend', 
    `company_name` varchar(50) NOT NULL, 
    `primary_contact` int(11) UNSIGNED NOT NULL, 
    `primary_address` int(11) UNSIGNED NOT NULL, 
    `primary_bankaccount` int(11) UNSIGNED NOT NULL, 
    `market` varchar(255) NOT NULL, 
    `awp_klasse` enum('Onbekend','Geen','1','2-4','5-9','10-19','20-49','50-99','100-199','200-499','500-749','750-999','>1000') DEFAULT 'Onbekend', 
    `awp_reeel` int(11) UNSIGNED DEFAULT 0, 
    `vatnumber` varchar(15) NOT NULL COMMENT 'BTW nummer', 
    `ccnumber` varchar(15) NOT NULL COMMENT 'KVK nummer', 
    `rsin_number` varchar(15) DEFAULT NULL COMMENT 'Rechtspersonen Samenwerkingsverbanden Informatie Nummer', 
    `establishment_number` varchar(25) DEFAULT NULL COMMENT 'Vestigingsnummer kamer', 
    `rvm` enum('Onbekend','Buitenlandse onderneming','Besloten Vennootschap','Cooperatieve Vereniging','Commanditaire Vennootschap','Eenmanszaak','Maatschap','Naamloze Vennootschap','Onderlinge Waarborgmaatschappij','Rederij','Stichting','Vereniging','Vennootschap Onder Firma','Europees Economisch Samenwerkingsverband','EG-vennootschap met onderneming in Nederland','EG-vennootschap met Hoofdnederzetting in Nederland','Semi EG-vennootschap met onderneming in Nederland','Semi EG-vennootschap met Hoofdnederzetting in Ned.','Nevenvestiging met vestiging buiten Nederland','Geen rechtsvorm (overheid etc.)','Rechtspersoon in oprichting','Kerkgenootschap','Overige rechtsvormen','Openbare Vennootschap','Europese Naamloze Vennootschap','Vereniging van Eigenaars','Publieksrechtelijke rechtspersoon','Privaatrechtelijke rechtspersoon') DEFAULT 'Onbekend' COMMENT 'Rechtsvorm', 
    `sbi` varchar(255) DEFAULT NULL COMMENT 'De Standaard Bedrijfsindeling', 
    `sideline_activities_1` varchar(255) DEFAULT NULL COMMENT 'Neven omschrijving', 
    `sideline_activities_2` varchar(255) DEFAULT NULL COMMENT 'Neven omschrijving', 
    `status` enum('Opgeheven','Failliet','Mailstop','Neutraal','Surseance van betaling','Wet Schuldsanering Natuurlijke Personen') NOT NULL DEFAULT 'Neutraal' COMMENT 'Graydon', 
    `boolean_deleted` tinyint(1) UNSIGNED NOT NULL DEFAULT 0, 
    `boolean_member` tinyint(1) UNSIGNED NOT NULL DEFAULT 0, 
    `date_created` datetime NOT NULL, 
    `reason_of_deletion` text NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `creator_id` (`creator_id`) comment '', 
    INDEX `boolean_deleted` (`boolean_deleted`) comment '', 
    INDEX `type` (`type`) comment '', 
    INDEX `primary_contact` (`primary_contact`) comment '', 
    INDEX `primary_address` (`primary_address`) comment '', 
    INDEX `primary_bankaccount` (`primary_bankaccount`) comment '', 
    INDEX `ccnumber` (`ccnumber`) comment '', 
    INDEX `company_name` (`company_name`) comment '', 
    FULLTEXT `search_company_name` (`company_name`) comment '', 
    FULLTEXT `search_ccnumber` (`ccnumber`) comment '' 
) ENGINE=`MyISAM` AUTO_INCREMENT=3045765 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0; 

回答

0

對於這個查詢,你需要你過濾列,您排序列上的索引。在這個方向。

你的情況:

 INDEX `yourindexname` (`boolean_deleted`, `company_name`) 

如果它的工作,「使用文件排序」不應再在你的解釋結果顯示。

+0

在組合索引中,首先選擇哪個列似乎很重要。 你是對的,「**使用文件排序**」不再被使用! SQL查詢現在的平均持續時間爲** 10秒**。 這可以進一步優化嗎? –

+0

一種可能性。如果您僅將此查詢用於選擇'id',則可以使用覆蓋索引對其進行測試。 這意味着查詢中所有使用的列都包含在索引中。我認爲 INDEX'yourindexname'('boolean_deleted','company_name','id') 看一看: [mysql詞彙表](http://dev.mysql.com/doc/innodb/1.1/en /glossary.html) – lopo

+0

我finnaly發現索引中列的正確順序應該是boolean_deleted,company_name和id。但我仍然想知道爲什麼...... SQL查詢現在的平均持續時間爲** 3秒**。 –