2016-04-08 21 views
1

kullanmıyor:MySQL sorgusu ben sorgusu altında var endeksi

SELECT bank_code, bank_name 
FROM system_bank_info 
WHERE company_id=1 AND country_id=103 AND status='ACTIVE' 
GROUP BY bank_name 
ORDER BY bank_name ASC 

TABLO ŞEMASI:

CREATE TABLE `system_bank_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `company_id` int(11) NOT NULL, 
    `country_id` int(11) NOT NULL, 
    `bank_code` varchar(50) NOT NULL, 
    `bank_name` varchar(255) NOT NULL, 
    `branch_code` varchar(50) NOT NULL, 
    `branch_name` varchar(255) NOT NULL, 
    `status` enum('ACTIVE','INACTIVE') NOT NULL DEFAULT 'ACTIVE', 
    `bank_state` varchar(255) DEFAULT NULL, 
    `bank_district` varchar(255) DEFAULT NULL, 
    `bank_city` varchar(255) DEFAULT NULL, 
    `bank_address` text, 
    `bank_contact` varchar(255) DEFAULT NULL, 
    `service_type` enum('INSTA_CREDIT') DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `country_id` (`country_id`), 
    KEY `bank_code` (`bank_code`), 
    KEY `branch_code` (`branch_code`), 
    KEY `company_id_country_id_status` (`company_id`,`country_id`,`status`), 
    CONSTRAINT `system_bank_info_ibfk_1` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`), 
    CONSTRAINT `system_bank_info_ibfk_2` FOREIGN KEY (`country_id`) REFERENCES `system_country_list` (`country_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=150398 DEFAULT CHARSET=utf8 

EXPLAIN: Gördüğünüz gibi

+----+-------------+------------------+------+-----------------------------------------+------------+---------+-------+-------+----------------------------------------------+ 
| id | select_type | table   | type | possible_keys       | key  | key_len | ref | rows | Extra          | 
+----+-------------+------------------+------+-----------------------------------------+------------+---------+-------+-------+----------------------------------------------+ 
| 1 | SIMPLE  | system_bank_info | ref | country_id,company_id_country_id_status | country_id | 4  | const | 59324 | Using where; Using temporary; Using filesort | 
+----+-------------+------------------+------+-----------------------------------------+------------+---------+-------+-------+----------------------------------------------+ 

denilen bir endeks var company_id_country_id_status. Ancak, sorgu yalnızca country_id kullanır. Bu sorguyu nasıl daha verimli hale getirebilirim?

Ben de endeksler bank_code ve bank_name ekleyerek çalıştı. Ama aynı sonuç! belirli bir dizini kullanır, böylece

+0

, neden sorguda bunları dize olarak geçiyor? Ayrıca, karşı karşıya kaldığınız performans sorununu ölçebilir ve "company_id" 1 ve "country_id" 103 için kaç tane satır olduğunu ve genel olarak tabloyu öğrenebilir misiniz? company_id' seçici indeksi (düşük önem düzeyi) bir atık ve herhangi bir performans vermez çünkü o mysql'in kullanmaz değildir 'ise –

+0

var 124294' satır company_id' 1' ile 've' 103 –

+1

country_id'. onun kardinalite düşüktür ve bir işe yaramaz endeksi (sadece uzay harcıyorsun ve herhangi bir performans elde yardımcı olamaz) anlamına gelir - Sen country_id = 1' 'ile' 124294' satır olduğunu söyledi. MySQL'i kullanmak için zorlayabilirsiniz, ancak sorguyu daha hızlı hale getirmeyecektir - tam tersi. – Mjh

cevap

0

Sen optimizer için ipuçları verebilir. `Country_id` ve` company_id` hem `int` türü ise USE INDEX()

SELECT bank_code, bank_name 
FROM system_bank_info USE INDEX (company_id_country_id_status) 
WHERE company_id=1 AND country_id=103 AND status='ACTIVE' 
+0

Bunu da denedim. Ancak, sorgu performansını iyileştirmek değil. Aynı yürütme zamanı. –

+0

@RonakPatel Ne * * yürütme süresi nedir? (Ayrıca, aslında endeksinin kullanılmasını zorlayarak yardım sorgu optimizasyoncusu muhtemelen doğru işini yapıyor gösterir etmediğini -. O yardımcı olmaz biliyordu, bu yüzden bunu kullanarak rahatsız etmedi) –