“无法转换为SELECT语句”这是什么意思

时间:2009-04-01 22:07:33

标签: mysql optimization

我正在尝试让我们的mySQL数据库运行得更快,我已经分析了我们的慢查询日志,最常见的慢查询是这样的:

CREATE TABLE IF NOT EXISTS `wp_bad_behavior` (
    `id` INT(11) NOT NULL auto_increment,
    `ip` TEXT NOT NULL,
    `date` DATETIME NOT NULL default '0000-00-00 00:00:00',
    `request_method` TEXT NOT NULL,
    `request_uri` TEXT NOT NULL,
    `server_protocol` TEXT NOT NULL,
    `http_headers` TEXT NOT NULL,
    `user_agent` TEXT NOT NULL,
    `request_entity` TEXT NOT NULL,
    `key` TEXT NOT NULL,
    INDEX (`ip`(15)),
    INDEX (`user_agent`(10)),
    PRIMARY KEY (`id`) );

我试图理解为什么这个查询不断被调用,因为在设置表之后它不应该继续发生。

EXPLAIN的结果是:无法转换为SELECT语句。

对此有任何想法都很棒!

3 个答案:

答案 0 :(得分:1)

EXPLAIN只能用于SELECT查询,这就是它抱怨的原因。至于为什么查询在慢查询日志中:删除并重新创建它 - 检查常规查询日志中的DROP TABLEs - 或者它只是因为表/数据库繁忙而阻塞 - 首先检查其他慢查询,尤其是那些查询在同一张桌子上。

答案 1 :(得分:0)

当然,您无法将CREATE语句转换为SELECT语句...

因此,问题是,为什么如此频繁地调用创建语句。它使用mysql的IF NOT EXISTS,因此它甚至可能不是设计问题,尽管查询被称为bazillion次,但表只会被创建一次。也许您的系统使用数据库从每个方法发出此语句,以确保实际数据库结构符合其期望。如果有人删除这个超级重要的表格,那只是一个傻瓜。

答案 2 :(得分:0)

它可能是一种从删除表的人恢复的简单方法。有人会删除表的一个很好的理由是它是一种简单的方法来摆脱旧的日志文件。但是,这显然会影响性能,因此您应该检查没有代码正在删除表,然后删除此检查。然后,在删除旧日志时,您将需要手动重新创建表。