2013-04-25 32 views
3

結果我有一個指標,幫助我們檢索速度更快的結構如下:MySQL的最更快地指數

CREATE TABLE IF NOT EXISTS `index_site` (`id_building` char(32) NOT NULL, `id_client` char(32) NOT NULL, `id_broker` smallint(5) unsigned NOT NULL, `kind_client` char(1) NOT NULL, `city` smallint(6) unsigned NOT NULL, `lat` float(10,6) NOT NULL, `lng` float(10,6) NOT NULL, `zone` smallint(2) unsigned NOT NULL, `sector` smallint(4) unsigned NOT NULL, `subregion` smallint(6) unsigned NOT NULL, `country` char(2) NOT NULL, `habs` smallint(5) unsigned NOT NULL, `bath` smallint(5) unsigned NOT NULL, `persons` smallint(5) unsigned NOT NULL, `include_elevator` enum('1','0') NOT NULL, `build_level` varchar(20) NOT NULL, `area` mediumint(8) unsigned NOT NULL, `area_um` enum('1','2','3','4','5') NOT NULL, `area_str` varchar(10) NOT NULL, `code` char(10) NOT NULL, `title` tinytext NOT NULL, `type_offer` varchar(50) NOT NULL, `offer_name` varchar(20) NOT NULL, `comments` text NOT NULL, `type_building` varchar(50) NOT NULL, `address` tinytext NOT NULL, `sector_name` tinytext NOT NULL, `city_name` varchar(50) NOT NULL, `subregion_name` varchar(50) NOT NULL, `area_terrain` varchar(10) NOT NULL, `area_um_terrain` tinyint(4) NOT NULL, `image` varchar(70) NOT NULL, `image_total` tinyint(2) unsigned NOT NULL, `build_status` tinyint(3) unsigned NOT NULL, `tags` text NOT NULL, `url` varchar(200) NOT NULL, `include_offer_value` enum('1','0') NOT NULL, `offer_value` varchar(15) NOT NULL, `offer_value_format` varchar(20) NOT NULL, `prc_comission` varchar(5) NOT NULL, `date_added` datetime NOT NULL, `date_updated` datetime NOT NULL, `date_expire` datetime NOT NULL, `date_suspended` date NOT NULL, `visits` int(11) NOT NULL, `kind_offer` tinyint(4) NOT NULL, `kind_building` tinyint(5) unsigned NOT NULL, `kind_building_type` tinyint(5) unsigned NOT NULL, `mark_bld` tinyint(3) unsigned NOT NULL, `mark_bld_color` char(7) NOT NULL, `status` tinyint(1) unsigned NOT NULL, `is_made` enum('0','1') NOT NULL, `is_project` enum('0','1') NOT NULL, `is_bm` enum('0','1') NOT NULL, `is_demo` enum('0','1') NOT NULL, `is_leading` enum('0','1') NOT NULL, `visible_in_metasearch` mediumtext NOT NULL, `visible_in_web` mediumtext NOT NULL, `seller_image` varchar(150) NOT NULL, `seller_name` varchar(50) NOT NULL, 
KEY `id_broker` (`id_broker`), KEY `id_client` (`id_client`), KEY `kind_building` `kind_building`), KEY `city` (`city`), KEY `offer_value` (`offer_value`), KEY `is_bm` (`is_bm`), KEY `status` (`status`), KEY `sector` (`sector`), KEY `zone` (`zone`), KEY `area` (`area`), KEY `prc_comission` (`prc_comission`), KEY `is_made` (`is_made`), KEY `is_leading` (`is_leading`), KEY `id_building` (`id_building`), KEY `date_added` (`date_added`), KEY `code` (`code`), KEY `country` (`country`), KEY `habs` (`habs`), KEY `kind_offer` (`kind_offer`), FULLTEXT KEY `tags` (`tags`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED; 

是的,它太大了! :)

好的,主題是在結構中我使用一些鍵,當我找到結果;這是正常的,我執行以下查詢:

SELECT * FROM `index_site` WHERE kind_building='1' AND kind_offer='1' AND city='1' 

這個查詢了0.0179秒,偉大的,但我想補充EXPLAIN來我查詢:

EXPLAIN SELECT * FROM `index_site` WHERE kind_building='1' AND kind_offer='1' AND city='1' 

我得到了以下結果:

+----+-------------+------------+-------------+-------------------------------+-------------------------------+---------+------+------+-------------------------------------------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+-------------+-------------------------------+-------------------------------+---------+------+------+-------------------------------------------------------------+ 
| 1 | SIMPLE | index_site | index_merge | kind_building,city,kind_offer | kind_offer,city,kind_building | 1,2,1 | NULL | 184 | Using intersect(kind_offer,city,kind_building); Using where | 
+----+-------------+------------+-------------+-------------------------------+-------------------------------+---------+------+------+-------------------------------------------------------------+ 

我使用正確的按鍵,但是在MySQL的額外列中,當我得到「使用哪裏」時,他們會說「你看起來有點不對勁」。

我的問題是,如果我有索引正確的查詢,有什麼問題得到「使用哪裏」什麼是錯的?

感謝您的幫助!

回答

1

從文檔:

如果Extra柱還表示Using where,則意味着該索引被用來執行密鑰值的查找。

您選擇表中的所有字段(*)。

由於並非所有字段都被合併相交中使用的索引覆蓋,所以需要在表中查找這些字段。

嘗試運行此:

SELECT kind_building, kind_offer, city 
FROM index_site 
WHERE kind_building = '1' 
     AND kind_offer = '1' 
     AND city = '1' 

,並Using where應該去。

+0

嗨!感謝您的快速回答,我執行了您的建議查詢,並解釋也仍然出現「使用where」,但現在我看到出現「Using index」,我明白MySQL使用該查詢的索引。我可以說這是正常的嗎? – josotoru 2013-04-25 15:28:03

+0

好的,我知道使用(*)的字段會更好。無論我是否需要調用幾乎所有的查詢字段,都會使用有效的索引。哦,太好了!謝謝! :) – josotoru 2013-04-25 15:36:15

+0

@josotoru:不是合併相交僅適用於等式謂詞,所以如果你有一個'>','BETWEEN'或列'IN',相應的索引無法在合併使用。 – Quassnoi 2013-04-25 16:25:01