我知道有很多Order By Questions与各种解决方案,但我要求的是特定于我已经在下面设置的数据结构。MySQL订购非常慢
我有以下2个表设置:
表设置
CREATE TABLE `record` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`file_group_id` INT(11) NOT NULL,
`status_id` INT(11) NOT NULL,
`title` VARCHAR(3000) NOT NULL,
`date_created` DATETIME NOT NULL,
`user_created` INT(11) NOT NULL,
`publish_date` DATETIME NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_RECORD_FGID` (`file_group_id`)
);
CREATE TABLE `record_meta_text` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`record_id` INT(11) NOT NULL,
`column_id` INT(11) NOT NULL,
`value` VARCHAR(3000) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `IDX_RMT_VALUE` (`value`(800)),
KEY `IDX_RMT_COL_ID` (`column_id`),
KEY `IDX_RMT_RECORD_ID_COL_ID` (`record_id`,`column_id`,`value`(800))
)
没有订单查询通过
SELECT
r.title AS col_title,
rmt_2780.value AS col_2780,
rmt_2781.value AS col_2781,
rmt_18474.value AS col_18474
FROM
record r
INNER JOIN record_meta_text AS rmt_2780 ON rmt_2780.record_id = r.id AND rmt_2780.column_id = 2780
INNER JOIN record_meta_text AS rmt_2781 ON rmt_2781.record_id = r.id AND rmt_2781.column_id = 2781
INNER JOIN record_meta_text AS rmt_18474 ON rmt_18474.record_id = r.id AND rmt_18474.column_id = 18474
WHERE
r.file_group_id = 2350
AND r.status_id = 1
LIMIT 0, 50
输出和解释
执行时间:0.004秒
这里是EXPLAIN输出:
id select_type table type possible_keys key key_len ref rows Extra
------ ----------- --------- ------ --------------------------------------- ------------------------ ------- ---------------------------- ------ -------------
1 SIMPLE r ref PRIMARY,IDX_RECORD_FGID IDX_RECORD_FGID 4 const 527895 Using where
1 SIMPLE rmt_18474 ref IDX_RMT_COL_ID,IDX_RMT_RECORD_ID_COL_ID IDX_RMT_RECORD_ID_COL_ID 8 file_cabinet_data.r.id,const 1 (NULL)
1 SIMPLE rmt_2780 ref IDX_RMT_COL_ID,IDX_RMT_RECORD_ID_COL_ID IDX_RMT_RECORD_ID_COL_ID 8 file_cabinet_data.r.id,const 1 (NULL)
1 SIMPLE rmt_2781 ref IDX_RMT_COL_ID,IDX_RMT_RECORD_ID_COL_ID IDX_RMT_RECORD_ID_COL_ID 8 file_cabinet_data.r.id,const 1 (NULL)
查询与顺序按
SELECT
r.title AS col_title,
rmt_2780.value AS col_2780,
rmt_2781.value AS col_2781,
rmt_18474.value AS col_18474
FROM
record r
INNER JOIN record_meta_text AS rmt_2780 ON rmt_2780.record_id = r.id AND rmt_2780.column_id = 2780
INNER JOIN record_meta_text AS rmt_2781 ON rmt_2781.record_id = r.id AND rmt_2781.column_id = 2781
INNER JOIN record_meta_text AS rmt_18474 ON rmt_18474.record_id = r.id AND rmt_18474.column_id = 18474
WHERE
r.file_group_id = 2350
AND r.status_id = 1
ORDER BY col_2780
LIMIT 0, 50
输出和解释
执行时间:35.237秒
id select_type table type possible_keys key key_len ref rows Extra
------ ----------- --------- ------ --------------------------------------- ------------------------ ------- ---------------------------- ------ ----------------------------------------------
1 SIMPLE r ref PRIMARY,IDX_RECORD_FGID IDX_RECORD_FGID 4 const 527895 Using where; Using temporary; Using filesort
1 SIMPLE rmt_2780 ref IDX_RMT_COL_ID,IDX_RMT_RECORD_ID_COL_ID IDX_RMT_RECORD_ID_COL_ID 8 file_cabinet_data.r.id,const 1 (NULL)
1 SIMPLE rmt_2781 ref IDX_RMT_COL_ID,IDX_RMT_RECORD_ID_COL_ID IDX_RMT_RECORD_ID_COL_ID 8 file_cabinet_data.r.id,const 1 (NULL)
1 SIMPLE rmt_18474 ref IDX_RMT_COL_ID,IDX_RMT_RECORD_ID_COL_ID IDX_RMT_RECORD_ID_COL_ID 8 file_cabinet_data.r.id,const 1 (NULL)
的问题及解决
所以,我的问题是,我怎么能得到这个不是由顺序采取永远。在几种情况下,我将通过条件以及声明的方式来进行多重排序。 LIMIT/OFFSET用于分页。
record
表当前有1,139,119条记录。
file_meta_text
表当前有7,584,428条记录。
我与基础架构和查询,但没有添加的数据(记录过多)一SQLFiddle:
http://sqlfiddle.com/#!2/6ffc3/1
任何帮助将不胜感激。
我会给指数一个尝试,让你知道。由于排序需要如何工作,第二个查询将不起作用。我会让你知道的。 – CodeLikeBeaker 2014-10-01 15:46:36
我添加了关于“IDX_RMT_VALUE”的笔记,我认为这是关于您的问题的最大线索。 – AndreaPosadino 2014-10-01 15:47:32
我同意,我必须在3000的值,这是填充缓冲区高于我的表中的最大长度。我也试过了文字,而且更糟。 – CodeLikeBeaker 2014-10-01 15:48:30