【问题标题】:Wrong result with 2 indexes2 个索引的错误结果
【发布时间】:2015-10-15 11:37:02
【问题描述】:
id  company  supplier
1   10       105
2   10       102
3   10       105
4   10       112
5   10       105

我们以上表为例。

使用公司和供应商作为索引。

使用 SELECT * FROM table WHERE company = 10; -> 返回 5 行。好的

使用 SELECT * from table WHERE supplier = 105; -> 返回 3 行。好的

使用 SELECT * from table WHERE company = 10 AND supplier = 105; -> 仅返回 1 行。这里有问题。

表使用的是 INNODB 格式。

我已经使用了 OPTIMIZE TABLE。

对这种行为有什么想法吗?

根据要求。 原表。字段“empresa”和“fornecedor”的问题。

CREATE TABLE `contas_lancadas` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_vinculo` int(11) unsigned NOT NULL DEFAULT '0',
  `tipo_vinculo` varchar(4) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'P' COMMENT 'P - Pedido, OS - Ordem de Serviço',
  `numero` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `data_doc` date DEFAULT NULL,
  `moeda` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `empresa` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'ID da empresa',
  `conta` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'ID do Plano de Conta',
  `fornecedor` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'ID dos Favorecidos (Cliente e Fornecedor)',
  `conta_corrente` int(6) unsigned NOT NULL DEFAULT '0' COMMENT 'ID da conta corrente',
  `vencto` date NOT NULL DEFAULT '0000-00-00',
  `pago` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0 - Não-Pago - 1 - Pago.',
  `valor` decimal(10,2) NOT NULL DEFAULT '0.00',
  `descricao` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `replicar` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '0 - Não possui réplica, 1 - È a conta origem de uma série replicada, N - ID da primeira conta',
  `condicao` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0 - Previsto - 1 - Real',
  `data_pgto` date DEFAULT '0000-00-00',
  `juros` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT 'juros pagos da conta',
  `multa` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT 'multa paga da conta',
  `desconto` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT 'desconto recebido da conta',
  `data_cadastro` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `id_caderneta` int(11) DEFAULT '0',
  `vencto_original` date DEFAULT '0000-00-00' COMMENT 'Data de vencimento original (data do cadastro)',
  PRIMARY KEY (`id`),
  KEY `id_pedido` (`id_vinculo`),
  KEY `numero` (`numero`),
  KEY `conta` (`conta`),
  KEY `conta_corrente` (`conta_corrente`),
  KEY `fornecedor` (`fornecedor`),
  KEY `empresa` (`empresa`)
) ENGINE=InnoDB AUTO_INCREMENT=1221384 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我尝试删除并重新创建索引。没有索引工作正常。和他们……同样的问题。

【问题讨论】:

  • 你能显示表格创建语句吗?
  • 我意识到问题出在“fornecedor”键上。如果我删除这个键,查询运行正确,但我重新创建键,问题又回来了。尝试使用新名称重新创建密钥,但错误仍然存​​在。
  • 如你所想,我使用了上面所有的代码并且它工作正常;-/ 请你添加你正在运行的软件的详细信息吗?即:操作系统、Mysql 版本以及您使用什么软件来检查查询结果,您的问题。
  • 我认为问题出在 mysql 版本上。 index_merge 和分区表的错误。现在尝试更新到 5.6.25。我正在使用 5.5.anything...(现在无法检查)
  • 这听起来像是一个有用的方法。我使用的是 5.5.16,但除了一个小的默认数据库之外没有使用任何东西。这只是我的开发电脑。

标签: mysql select indexing


【解决方案1】:

问题解决了。

将 MySQL 更新到版本 5.6.19(原为 5.5.something)。

问题在于具有多个索引的分区表。更多信息在这里link

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2012-03-17
    • 2019-10-18
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多