MySQL 使用索引最快的结果

标签 mysql performance indexing

我有以下带有索引的结构,可以帮助我们更快地检索:

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 的 Extra 列中,当我得到“Using where”时,他们说“你看起来有些不对劲”。

我的问题是,如果我有一个正确的索引查询,那么“Using where”错误的问题是什么?

感谢您的帮助!

最佳答案

来自文档:

If the Extra column also says Using where, it means the index is being used to perform lookups of key values.

您正在从表中选择所有字段 (*)。

由于并非所有字段都被合并交叉中使用的索引覆盖,因此需要在表本身中查找这些字段。

尝试运行这个:

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

Using where should go.

关于MySQL 使用索引最快的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16218580/

相关文章:

mysql - 我可以在 MySQL 中自动插入 SSL 证书的 PEM 文件密码吗?

mySQL - 列的总和

java - Spring Data JPA : @Query gives error java. sql.SQLException:找不到列 'id'

performance - CyclicDist 在多个语言环境中变慢

jquery - 更高效的 jQuery

silverlight 4 treeview 在很多项目时扩展缓慢

ruby-on-rails - Rails 数据库索引 : Is this an anti-pattern?

postgresql - Postgres UNIQUE 约束是否意味着索引?

sql-server - 在非唯一聚集索引上查找的逻辑读取

php - 运行 SQL 查询并根据下拉选择更新表单