【问题标题】:Need suggestion on optimization of MYSQL query需要关于优化MYSQL查询的建议
【发布时间】:2013-11-14 06:45:02
【问题描述】:
SELECT `tb1`.`id` 
FROM `table1` as tb1
INNER JOIN `table2` as tb2 ON tb1.id = tb2.id
INNER JOIN `table3` as tb3 ON tb1.id = tb3.id 
WHERE (tb1.item_id = '1') 
AND (tb1.user_id = '20') 
AND (tb1.type IN ('UPDATE1','UPDATE2','UPDATE3')) 
AND (tb1.status = 'DELIVERED') 
ORDER BY tb1.date DESC 
LIMIT 100


CREATE TABLE `table1` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `user_id` INT(11) UNSIGNED NOT NULL,
    `item_id` INT(11) UNSIGNED NULL DEFAULT NULL,
    `source` ENUM('CPAS','UNIQUE_KEY','BILLING_PARTNER','GAME','MERCURY') NOT NULL,
    `date` DATETIME NOT NULL,
    `status` ENUM('PENDING','DELIVERED','FAILED','REFUNDED') NOT NULL,
    `source_transaction_id` VARCHAR(127) NULL DEFAULT NULL,
    `type` ENUM('UPDATE1','UPDATE2','UPDATE3','UPDATE4') NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
);


CREATE TABLE `table2` (
    `id_p` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `id` INT(11) UNSIGNED NOT NULL,
    `amount` DECIMAL(18,2) NOT NULL,
    `old_balance` DECIMAL(18,2) NULL DEFAULT NULL,
    `description` VARCHAR(255) NULL DEFAULT NULL,
    `date` DATETIME NULL DEFAULT NULL,
    `wallet_currency_id` INT(11) NULL DEFAULT NULL,
    `wallet_currency_code` VARCHAR(50) NULL DEFAULT NULL,
    `wallet_currency_name` VARCHAR(100) NULL DEFAULT NULL,
    `type` ENUM('GAIN','SPENT') NULL DEFAULT NULL,
    PRIMARY KEY (`id_p`),
    INDEX `id` (`id`)
)


CREATE TABLE `table3` (
    `id_p` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `id` INT(11) UNSIGNED NOT NULL,
    `amount` DECIMAL(18,2) NOT NULL,
    `old_balance` DECIMAL(18,2) NULL DEFAULT NULL,
    `description` VARCHAR(255) NULL DEFAULT NULL,
    `date` DATETIME NULL DEFAULT NULL,
    `wallet_currency_id` INT(11) NULL DEFAULT NULL,
    `wallet_currency_code` VARCHAR(50) NULL DEFAULT NULL,
    `wallet_currency_name` VARCHAR(100) NULL DEFAULT NULL,
    `type` ENUM('GAIN','SPENT') NULL DEFAULT NULL,
    PRIMARY KEY (`id_p`),
    INDEX `id` (`id`)
)

上述查询可以进行哪些优化。 table1 包含超过 500000 行,table2 和 table3 也可以有超过 100000 行。

根据对特定玩家和游戏桌的查询,table1 可以有超过 100000 行。

上述查询是否适用于大型大型表,或者我应该将查询拆分为多个查询。

使用了 NDB 引擎。

请建议我可能的优化。

谢谢, 湿婆

【问题讨论】:

  • 请为 table1、table2 和 table3 发布您的 CREATE 语句。
  • 一项优化是将 tb1.status 和 tb1.type 更改为整数。整数比较比字符串比较快。
  • tb1.status 和 tb1.type 都是枚举
  • 发布EXPLAIN 的输出和表结构
  • 添加有问题的table1、table2、table3的create语句。

标签: mysql join query-optimization


【解决方案1】:

请参阅上面的 cmets,但猜测一下,(item_id,user_id,type,status) 上的索引可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2016-02-02
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多