【发布时间】:2011-12-12 02:28:24
【问题描述】:
以下查询在 user_chars(大约 20 毫米记录)和 user_data(大约 10 毫米记录)上运行。查询运行太慢,我想知道更好的复合索引是否可以改善这种情况。
你知道什么是最好的复合索引吗?
SELECT username, title, status
FROM (
SELECT username, title, status
FROM user_chars w, user_data r
WHERE w.user_id = r.user_id
AND (status < '300' OR is_admin = '1')
AND (
(rating_id = 'rating1' AND rating BETWEEN 55 AND 65)
OR (rating_id = 'rating2' AND rating BETWEEN 50 AND 60)
OR (rating_id = 'rating3' AND rating BETWEEN 30 AND 40)
OR (rating_id = 'rating4' AND rating BETWEEN 90 AND 100)
...
)
GROUP BY w.user_id
HAVING COUNT(*) >= 3
) data
WHERE username != '0'
AND title != '0'
以下是表格:
CREATE TABLE user_data (
user_id int(10) unsigned NOT NULL AUTO_INCREMENT,
username decimal(17,14) DEFAULT NULL,
title decimal(17,14) DEFAULT NULL,
status smallint(6) unsigned NOT NULL,
is_admin tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (user_id),
KEY username (username),
KEY title (title),
KEY status (status),
KEY is_admin (is_admin),
KEY chars_avg_index (user_id,username,title,status),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE user_chars (
user_id int(10) unsigned NOT NULL,
rating_id char(32) DEFAULT NULL,
rating tinyint(3) unsigned NOT NULL,
PRIMARY KEY (user_id),
KEY rating_id (rating_id),
KEY rating (rating),
KEY chars_index (user_id,rating_id,rating)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
编辑:添加解释
+----+-------------+------------+--------+-------- ------------------------------------+------------- ----+---------+------------+-------+--------------- --------------------------------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+------------+--------+-------- ------------------------------------+------------- ----+---------+------------+-------+--------------- --------------------------------------------+ | 1 |初级 | |全部 |空 |空 |空 |空 | 3668 |使用位置 | | 2 |派生 | w |范围 | user_id,rating_id,rating,chars_index |字符索引 | 98 |空 | 13215 |使用哪里;使用索引;使用临时的;使用文件排序 | | 2 |派生 | r | eq_ref | PRIMARY,status,is_admin,chars_avg_index |初级 | 4 | w.user_id | 1 |使用位置 | +----+-------------+------------+--------+-------- ------------------------------------+------------- ----+---------+------------+-------+--------------- --------------------------------------------+【问题讨论】:
-
我知道您的问题是关于索引而不是查询本身,但是这里使用子查询而不是单个查询的原因是什么?
-
没有真正的原因。您将如何重写查询?
-
我用重写的查询编辑了我的答案:]