2016-11-24 75 views
0

我有表,這種結構:MySQL表 - 性能,指標數

CREATE TABLE `supplies` (
`cycle_id` int(11) NOT NULL, 
`subject_id` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
`market_id` int(11) NOT NULL, 
`price` int(11) NOT NULL, 
`currency_id` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
`offered_order` bigint(20) DEFAULT NULL, 
PRIMARY KEY (`subject_id`,`market_id`,`cycle_id`,`price`), 
KEY `fk_supplies_subjects` (`subject_id`), 
KEY `fk_supplies_markets` (`market_id`), 
KEY `fk_supplies_currencies` (`currency_id`), 
CONSTRAINT `fk_supplies_currencies` FOREIGN KEY (`currency_id`) REFERENCES `currencies` (`currency_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_subjects` FOREIGN KEY (`subject_id`) REFERENCES `subjects` (`subject_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_markets` FOREIGN KEY (`market_id`) REFERENCES `markets` (`market_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

表有大約20000行。我的表現有問題。我日誌記錄正在服用時間長的SQL查詢和從日誌中我可以看到:

  1. INSERT s轉換表。

    INSERT INTO supplies VALUES (11, 'userName', 18, 30, 'pound', 20) ; 
    
  2. 從錶慢DELETE小號

    DELETE FROM supplies WHERE cycle_id = 6 AND market_id = 18 AND subject_id = 'userName' ; 
    

我能怎麼改善?

我想,改變索引會有所幫助,因爲PRIMARY鍵是由4列組成(有些甚至是varchars)。但我應該如何更改索引?

謝謝大家。

+0

你爲什麼選擇非整數ID? – Strawberry

+0

@Strawberry - 我沒有設計這張桌子,我的目標是優化它。我會將id更改爲整數。 –

+0

在'PRIMARY KEY'中包含'price'似乎並不正確;請解釋。 –

回答

1

您應該只創建一個只有一個字段的主鍵。這是基本的性能優化

CREATE TABLE `supplies` (
`supplies_id` int(11) NOT NULL AUTO_INCREMENT, 
`cycle_id` int(11) NOT NULL, 
`subject_id` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
`market_id` int(11) NOT NULL, 
`price` int(11) NOT NULL, 
`currency_id` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
`offered_order` bigint(20) DEFAULT NULL, 
PRIMARY KEY (`supplies_id`), 
INDEX `index` (`subject_id` ASC,`market_id` ASC,`cycle_id` ASC,`price` ASC)) 
KEY `fk_supplies_subjects` (`subject_id`), 
KEY `fk_supplies_markets` (`market_id`), 
KEY `fk_supplies_currencies` (`currency_id`), 
CONSTRAINT `fk_supplies_currencies` FOREIGN KEY (`currency_id`) REFERENCES `currencies` (`currency_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_subjects` FOREIGN KEY (`subject_id`) REFERENCES `subjects` (`subject_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_markets` FOREIGN KEY (`market_id`) REFERENCES `markets` (`market_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

另一種可能的改進是可以去除級聯約束。檢查他們是否真的有必要。

+0

嗯,我相信這會加速插入,但DELETES呢? –

+0

只有一個字段的主鍵將加速插入和刪除。刪除級聯約束將加速刪除和更新。 –

+0

請解釋「一場PK比較好」的理由。 –