2017-10-12 128 views
-1

我一直在努力創建正確的索引來提高我們在我們的數據庫上運行的特定查詢的性能,我希望你們中的一個人可以幫助我指出我的權利方向。MySQL索引高效地查詢表與多對多的關係

我有兩張桌子,按照下面。例如,我有一個查詢來查找屬於某個特定類別的公司的所有員工,其名稱以「Be%」爲例。我試圖在category_id, company_id上創建一個多重索引,但這沒有幫助。什麼應該是正確的方式來索引我的表來實現這個查詢的更好的性能?先謝謝你。

SELECT 
    e.* 
FROM employee e 
INNER JOIN company c ON e.company_id = c.company_id 
WHERE c.category_id = 6 
AND e.first_name LIKE "Be%" 
GROUP BY e.employee_id 

表公司

| company_id | category_id | 
+------------+-------------+ 
| ...  | ...   | 
+------------+-------------+ 
| 47   | 6   | 
+------------+-------------+ 
| ..   | ...   | 
+------------+-------------+ 
| 252  | 6   | 
+------------+-------------+ 

Employee表

| employee_id | company_id | first_name | ... | 
+-------------+------------+------------+-----+ 
| 2582250  | 47   | Ben  | ... | 
+-------------+------------+------------+-----+ 
| 3447890  | 252  | Ryan  | ... | 
+-------------+------------+------------+-----+ 
| 7125966  | 252  | Beth  | ... | 
+-------------+------------+------------+-----+ 
| ...   | ...  | ...  | ... | 
+-------------+------------+------------+-----+ 

創建表的下方,sqlfiddle

CREATE TABLE company (
    `company_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `category_id` INT UNSIGNED NOT NULL DEFAULT 0 
) ENGINE=InnoDB; 

CREATE TABLE employee (
    `employee_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `company_id` INT UNSIGNED NOT NULL, 
    `first_name` VARCHAR(255) 
) ENGINE=InnoDB; 
+0

我建議......和......,還有...。或者,請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql - 查詢 – Strawberry

+0

@Strawberry謝謝我已按要求添加。不幸的是,這隻會成爲一個幾百萬行的問題,這在sqlfiddle中是不可行的。 – Martin

+0

好的。我應該添加... – Strawberry

回答

1

必須有很多索引:許多表。請按照建議here

WHERE c.category_id = 6 
    AND e.first_name LIKE "Be%" 

需要

c: INDEX(category_id, company_id) -- which will be called for in the link above 
e: INDEX(first_name, employee_id) 

優化器將要麼c開始,然後將手伸入e。或相反亦然。我爲您提供任一方向的最佳指標。