1 回答
TA贡献1895条经验 获得超7个赞
为什么我们先添加timekey然后删除它?将其添加到空表中速度很快,但是在填充后将其从表中删除,这就像表的额外副本。如果我们不需要的话,那是不必要的工作。
我们可以GROUP BY对表达式执行 a;该表达式不必出现在 SELECT 列表中,例如:
SELECT t.*
FROM main_table t
WHERE t.column_name <= '2018-01-01'
GROUP
BY FLOOR(UNIX_TIMESTAMP(t.column_name)/((1440/2)*60))
ONLY_FULL_GROUP_BY(请注意,如果包含在 sql_mode 中,此查询将导致错误;这将禁用允许查询运行的 MySQL 特定扩展。)
如果没有一些表定义(包括存储引擎、列数据类型、索引)并且没有 EXPLAIN 输出,我们只是猜测。
但一些建议:
删除正在填充的空表上的二级索引,并在表加载后添加它们。
我会避开工会。鉴于其中一个 SELECT 语句有一个谓词,column_name而另一个 SELECT 语句有一个完全不同的列上的谓词date,我们确实希望分隔 SELECT 语句。
CREATE TABLE main_table_tmp LIKE main_table
;
-- for performance, remove secondary indexes, leave just the cluster index
ALTER TABLE main_table_tmp
DROP INDEX noncluster_index_1
, DROP INDEX noncluster_index_2
, ...
;
-- for performance, have a suitable index available on main_table
-- with `column_name` as the leading column
INSERT INTO main_table_tmp
SELECT h.*
FROM main_table h
WHERE h.column_name <= '2018-01-01'
GROUP
BY FLOOR(UNIX_TIMESTAMP(h.column_name)/((1440/2)*60))
;
-- for performance, have a suitable index available on main_table
-- with `date` as the leading column
INSERT INTO main_table_tmp
SELECT c.*
FROM main_table
WHERE c.date > '????-??-??'
;
-- add secondary indexes
ALTER TABLE maint_table_tmp
ADD UNIQUE INDEX noncluster_index_1 (fee,fi,fo)
, ADD INDEX noncluster_index_2 (fum)
, ...
;
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报