-1
  1. 我的查询运行时间超过 4 秒。
  2. 我希望在不到 1 秒的时间内得到结果
  3. 帮帮我。

询问:

SELECT a.index_id,
       title
FROM fb_indices a,
     fb_catalog_indices b FORCE INDEX (idx_1986)
WHERE a.index_id = b.index_id
  AND type = 'international'
  AND title IS NOT NULL

解释计划:

mysql> explain select a.index_id,title from fb_indices a, fb_catalog_indices b force index (idx_1986) where a.index_id = b.index_id and type='international' and title is not NULL;
+----+-------------+-------+------+-----------------+----------+---------+----------------+------+-------------+
| id | select_type | table | type | possible_keys   | key      | key_len | ref            | rows | Extra       |
+----+-------------+-------+------+-----------------+----------+---------+----------------+------+-------------+
|  1 | SIMPLE      | a     | ref  | idx_836,idx_450 | idx_450  | 53      | const          |   79 | Using where |
|  1 | SIMPLE      | b     | ref  | idx_1986        | idx_1986 | 103     | cms.a.index_id |  590 | Using where |
+----+-------------+-------+------+-----------------+----------+---------+----------------+------+-------------+
2 rows in set (0.00 sec)

结构:

mysql> show create table fb_indices\G
*************************** 1. row ***************************
       Table: fb_indices
Create Table: CREATE TABLE `fb_indices` (
  `row_mod` datetime DEFAULT NULL,
  `row_create` datetime DEFAULT NULL,
  `index_id` varchar(100) COLLATE latin1_bin DEFAULT NULL,
  `description` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `country_id` varchar(2) COLLATE latin1_bin DEFAULT NULL,
  `index_level` int(11) DEFAULT NULL,
  `type` varchar(50) COLLATE latin1_bin DEFAULT NULL,
  `approval_flag` int(11) DEFAULT NULL,
  `username` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `search_product_type` int(11) DEFAULT NULL,
  `search_color` int(11) DEFAULT NULL,
  `search_price` int(11) DEFAULT NULL,
  UNIQUE KEY `idx_836` (`index_id`),
  KEY `idx_450` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
1 row in set (0.00 sec)

mysql> show create table fb_catalog_indices\G
*************************** 1. row ***************************
       Table: fb_catalog_indices
Create Table: CREATE TABLE `fb_catalog_indices` (
  `row_mod` datetime DEFAULT NULL,
  `row_create` datetime DEFAULT NULL,
  `index_id` varchar(100) COLLATE latin1_bin DEFAULT NULL,
  `website_id` varchar(50) COLLATE latin1_bin DEFAULT NULL,
  `title` varchar(100) COLLATE latin1_bin DEFAULT NULL,
  `subheading` longtext COLLATE latin1_bin,
  `product_ids` longtext COLLATE latin1_bin,
  `sub_index_ids` longtext COLLATE latin1_bin,
  `mapped_index_ids` longtext COLLATE latin1_bin,
  `username` varchar(100) COLLATE latin1_bin DEFAULT NULL,
  `content` longtext COLLATE latin1_bin,
  `meta_description` longtext COLLATE latin1_bin,
  `meta_tag_keyword` longtext COLLATE latin1_bin,
  `mapped_link_text` longtext COLLATE latin1_bin,
  `mapped_alt_tags` longtext COLLATE latin1_bin,
  `long_title` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `html_content` longtext COLLATE latin1_bin,
  `use_html_content` int(11) DEFAULT '0',
  `flash_size` longtext COLLATE latin1_bin,
  `custom_index_ids` longtext COLLATE latin1_bin,
  `html_header_1` longtext COLLATE latin1_bin,
  `html_header_2` longtext COLLATE latin1_bin,
  `search_product_type` int(11) DEFAULT NULL,
  `search_color` int(11) DEFAULT NULL,
  `search_price` int(11) DEFAULT NULL,
  `disable_rankings` int(11) DEFAULT NULL,
  `html_footer_1` longtext COLLATE latin1_bin,
  `dramashot_html` longtext COLLATE latin1_bin,
  `quickshop_image` longtext COLLATE latin1_bin,
  `sort_by_price_css` longtext COLLATE latin1_bin,
  `pagination_css` longtext COLLATE latin1_bin,
  `suppress_navigation` int(11) DEFAULT NULL,
  `suppress_quickshop_image` int(11) DEFAULT NULL,
  `mvt_control_script` longtext COLLATE latin1_bin,
  `mvt_tracking_script` longtext COLLATE latin1_bin,
  `enable_gbb_mouse` int(11) DEFAULT NULL,
  `enable_gbb_click` int(11) DEFAULT NULL,
  `last_modified_time` datetime DEFAULT NULL,
  `seo_footer_content` longtext COLLATE latin1_bin,
  `alternate_gfi` int(11) DEFAULT NULL,
  `zip_finder_html_content` longtext COLLATE latin1_bin,
  `disable_quick_view_widget` int(11) DEFAULT NULL,
  `indexpromo_title` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `indexpromo_style` longtext COLLATE latin1_bin,
  `background_color` text COLLATE latin1_bin,
  `sameday_text` text COLLATE latin1_bin,
  `productdesc_text` text COLLATE latin1_bin,
  `productprice_text` text COLLATE latin1_bin,
  `gbbcatalog_text` text COLLATE latin1_bin,
  `max_products_display` int(11) DEFAULT NULL,
  UNIQUE KEY `idx_1986` (`index_id`,`website_id`),
  KEY `idx_1055` (`website_id`),
  KEY `idx_836` (`index_id`),
  KEY `idx_1812` (`last_modified_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
1 row in set (0.00 sec)
4

2 回答 2

1

创建以下索引:

CREATE INDEX idx_999 ON fb_indices (index_id, type);

之后,此查询与您的查询等效,并且应该可以快速运行:

SELECT a.index_id,
       b.title
FROM fb_indices a
JOIN fb_catalog_indices b ON (a.index_id = b.index_id)
WHERE a.type = 'international'
  AND b.title IS NOT NULL

提示:尽量不要强制使用索引 - 在你的情况下,这很痛苦。相反,创建一个适当的索引。

于 2013-03-07T09:02:16.947 回答
0
SELECT a.index_id,
       title
FROM fb_indices a,
     (
        SELECT 
            index_id 
        FROM 
            fb_catalog_indices 
        WHERE  
            type = 'international'
     ) as b 
WHERE a.index_id = b.index_id
  AND title IS NOT NULL
于 2013-03-07T09:05:56.827 回答