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;
在組合索引中,首先選擇哪個列似乎很重要。 你是對的,「**使用文件排序**」不再被使用! SQL查詢現在的平均持續時間爲** 10秒**。 這可以進一步優化嗎? –
一種可能性。如果您僅將此查詢用於選擇'id',則可以使用覆蓋索引對其進行測試。 這意味着查詢中所有使用的列都包含在索引中。我認爲 INDEX'yourindexname'('boolean_deleted','company_name','id') 看一看: [mysql詞彙表](http://dev.mysql.com/doc/innodb/1.1/en /glossary.html) – lopo
我finnaly發現索引中列的正確順序應該是boolean_deleted,company_name和id。但我仍然想知道爲什麼...... SQL查詢現在的平均持續時間爲** 3秒**。 –