分区表sql优化问题

先发表结构吧 : CREATE TABLE tbl-game-4d3d2d-txptest4d-final (
4d3d2d_id bigint(20) NOT NULL AUTO_INCREMENT,
4d3d2d_inv_no varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT ‘0’,
4d3d2d_member_id int(11) DEFAULT NULL,
4d3d2d_member_username varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
4d3d2d_produk_id int(11) DEFAULT ‘0’,
4d3d2d_produk_code varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
4d3d2d_produk_name varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
4d3d2d_periode_id int(11) DEFAULT NULL,
4d3d2d_periode_name varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
4d3d2d_game varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
4d3d2d_mode varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT ‘diskon’,
4d3d2d_tebakan varchar(5) DEFAULT NULL,
4d3d2d_4d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_3d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_2d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_disc_4d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_disc_3d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_disc_2d decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_disc decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_bayar decimal(14,2) DEFAULT ‘0.00’,
reg_date timestamp DEFAULT CURRENT_TIMESTAMP,
deleted_at timestamp NULL DEFAULT NULL,
4d3d2d_tebakan_win varchar(5) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
4d3d2d_4d_prize decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_3d_prize decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_2d_prize decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_prize decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_winloss_status_4D varchar(5) COLLATE utf8mb4_unicode_ci DEFAULT ‘none’,
4d3d2d_winloss_amount_4D decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_winloss_status_3D varchar(5) COLLATE utf8mb4_unicode_ci DEFAULT ‘none’,
4d3d2d_winloss_amount_3D decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_winloss_status_2D varchar(5) COLLATE utf8mb4_unicode_ci DEFAULT ‘none’,
4d3d2d_winloss_amount_2D decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_winloss_status varchar(5) COLLATE utf8mb4_unicode_ci DEFAULT ‘none’,
4d3d2d_winloss_amount decimal(14,2) DEFAULT ‘0.00’,
4d3d2d_check_code varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT ‘0’,
referral_bonus decimal(5,2) DEFAULT NULL,
agent_name varchar(50) DEFAULT NULL,
four_game_mode varchar(40) DEFAULT NULL,
bet_result_json json DEFAULT NULL,
referral_odds decimal(14,2) DEFAULT NULL COMMENT ‘转介’,
4d3d2d_pre_payout decimal(14,2) DEFAULT NULL COMMENT ‘预计派彩额’,
PRIMARY KEY (4d3d2d_id,4d3d2d_produk_code,4d3d2d_periode_name) /*T![clustered_index] CLUSTERED */,
KEY reg_date_idx (reg_date),
KEY 4d3d2d_tebakan_idx (4d3d2d_tebakan),
KEY final_query_4d3d2d_periode_name (4d3d2d_periode_name),
KEY agent_name_idx (agent_name),
KEY game_idx (4d3d2d_game),
KEY bet_query_idx (4d3d2d_produk_code,4d3d2d_game,agent_name,4d3d2d_mode,4d3d2d_tebakan)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=108344209
PARTITION BY LIST COLUMNS(4d3d2d_periode_name)
(PARTITION pGame1 VALUES IN (1),
PARTITION pGame2 VALUES IN (2),
PARTITION pGame3 VALUES IN (3),
PARTITION pGame4 VALUES IN (4),
PARTITION pGame5 VALUES IN (5),…以下省略1000个分区

我的查询sql 的执行计划 :
EXPLAIN SELECT * FROM tbl-game-4d3d2d-TXPTEST4D-final WHERE
4d3d2d_produk_code=‘TXPTEST4D’
and
4d3d2d_periode_name=‘34’
and 4d3d2d_game = ‘4D’

        AND agent_name IN
       ('ID000022','ID000023','ID000024')
  
    and (4d3d2d_mode ='Full' or 4d3d2d_mode='Diskon')
			AND 4d3d2d_tebakan='1234'


我期望是 走bet_query_idx这个索引 但是 告诉我是都 失效了

你的执行计划走的看着就是这个索引啊。

我看着也是啊,但是 info 里面有提示 bet_query_idx:missing 。

我 执行计划查看 select 4d3d2d_produk_code from … 显示的话是走了索引。猜测是 select* 回表了 。

确实走了这个 bet_query_idx索引。

info提示,前面还有个stat:partial,意思是统计信息不完整,所以对应的这个

bet_query_idx:missing

没有这个bet_query_idx索引的统计信息,并不是没有走这个索引。

2 个赞

手工收集下这个表的统计再看看

analyze 下 table 把统计信息补全了

统计信息不完整,我看 分析表状态 的时候,有看到 有的分区 分析失败了,还有就是全局索引创建失败 。 要关掉 全局索引嘛

我这有1000个分区 用 命令看了 分析状态 显示的 有些分区失败 ,还有就是 合并全局索引失败

analyze table后再试试。另外你这个表名和字段定义的也是绝了。真的是千姿百态啊!

哈哈 老项目了 ,你懂的 无法呀

根据图示就是统计信息不太准

8.1版本修复了一堆统计信息相关的问题。

以前版本的统计信息收集确实有点问题,容易oom而且效率也低。

https://docs.pingcap.com/zh/tidb/stable/release-8.1.0#错误修复