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?
bank_code
ve
bank_name
ekleyerek çalıştı. Ama aynı sonuç! belirli bir dizini kullanır, böylece
, 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 –
var 124294' satır company_id' 1' ile 've' 103 –
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