mysql log_queries_not_using_indexes 工作错误?

标签 mysql performance stored-procedures mysql-slow-query-log

我有以下程序:

CREATE PROCEDURE getProjectTeams(IN p_idProject INTEGER)
BEGIN
 SELECT idTeam, name, workersCount, confirmersCount, isConfirm 
 FROM Teams JOIN team_project USING (idTeam)
 WHERE idProject = p_idProject;
END $$

这里是表 Teamsteam_projectCREATE TABLE 脚本:

CREATE TABLE Teams (
 idTeam INT PRIMARY KEY auto_increment,
 name CHAR(20) NOT NULL UNIQUE,
 isConfirm BOOL DEFAULT 0,
 workersCount SMALLINT DEFAULT 0,
 confirmersCount SMALLINT DEFAULT 0 
) engine = innodb DEFAULT CHARACTER SET=utf8 COLLATE=utf8_polish_ci;

CREATE TABLE team_project (
idTeam INT NOT NULL,
idProject INT NOT NULL,
FOREIGN KEY(idTeam) REFERENCES Teams(idTeam)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
FOREIGN KEY (idProject) REFERENCES Projects(idProject)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
PRIMARY KEY(idTeam, idProject)
) engine = innodb DEFAULT CHARACTER SET=utf8 COLLATE=utf8_polish_ci;

我的服务器上几乎没有具有相同架构的数据库,但只有当一个数据库调用此过程时才会记录该过程。不会记录其他数据库执行的调用。这不是查询慢不慢的问题(总是需要0.0001s左右)。这就是为什么它被记录为不使用索引。这怎么可能?

正如 Zagor23 建议的那样,我运行了 EXPLAIN ,结果如下。 a) 在记录过程的数据库中:

| id | select_type | table        | type | possible_keys     | key       | key_len | ref   | rows | Extra                          |
|  1 | SIMPLE      | team_project | ref  | PRIMARY,idProject | idProject | 4       | const |    3 | Using index                    |
|  1 | SIMPLE      | Teams        | ALL  | PRIMARY           | NULL      | NULL    | NULL  |    4 | Using where; Using join buffer |

b) 数据库,其中未记录过程:

| id | select_type | table        | type   | possible_keys     | key       | key_len | ref                              | rows | Extra       |
|  1 | SIMPLE      | team_project | ref    | PRIMARY,idProject | idProject | 4       | const                            |    1 | Using index |
|  1 | SIMPLE      | Teams        | eq_ref | PRIMARY           | PRIMARY   | 4       | ecovbase.team_project.idTeam |    1 |             |

事实是 - 数据有点不同,但差异不大。 GoodDB(不记录过程的)在 Teams 中有 11 行,在 team_project 中有 420 行,BadDB 在 Teams 中有 4 行,在 team_project 中有大约 800 行。看起来不像是差价。有没有办法避免记录该过程?

最佳答案

也许它没有被记录,因为它在这些情况下使用索引。 尝试运行

EXPLAIN SELECT idTeam, name, workersCount, confirmersCount, isConfirm 
FROM Teams JOIN team_project USING (idTeam)
WHERE idProject = p_idProject;

在您认为不应该使用索引的数据库上,看看它是否确实如此。 如果有可用且适合查询的索引,并且返回的结果集达到整个结果集的 7-8% 左右,MySql 将使用索引。

您说 information_schema 是相同的,但如果数据不同,则可能是导致不同行为的原因。

关于mysql log_queries_not_using_indexes 工作错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11345899/

相关文章:

python - 有没有更有效的方法来编写合并函数?

ruby-on-rails - 是否可以在 Ruby 1.9 中透明地实现 ActiveRecord 查询的 Future 模式?

MySQL 查询需要超过 15 分钟,看起来数据量并不大

java - jTDS + 存储过程 + prepareSQL = 嵌套级错误?

mysql - 错误的 SQL 语法...未找到列 "COUNT(status)"

php - Yii 为添加的数据库列值返回 NULL

python - WHERE 子句中的子查询

mysql - 提高 MySQL 中存储过程的性能

php - mysql存储过程中如何使用赋值运算符

php - 从 php 中的另一个表(查询 1)插入数据库表(查询 2)