MySQL 5.1.26 verMySQL: por fin y el límite da un resultado erróneo
estoy recibiendo un resultado erróneo con una selección que tiene en las que, por fin cláusulas y límite. Es solo un problema cuando la orden utiliza la columna de id.
vi el manual de MySQL para LIMIT Optimization
Mi conjetura de la lectura del manual es que hay algún problema con el índice en la clave principal, id. Pero no sé a dónde debería ir desde aquí ...
Pregunta: ¿qué debo hacer para resolver mejor el problema?
Works correctly:
mysql> SELECT id, created_at FROM billing_invoices
WHERE (billing_invoices.account_id = 5) ORDER BY id DESC ;
+------+---------------------+
| id | created_at |
+------+---------------------+
| 1336 | 2010-05-14 08:05:25 |
| 1334 | 2010-05-06 08:05:25 |
| 1331 | 2010-05-05 23:18:11 |
+------+---------------------+
3 rows in set (0.00 sec)
WRONG result when limit added! Should be the first row, id - 1336
mysql> SELECT id, created_at FROM billing_invoices
WHERE (billing_invoices.account_id = 5) ORDER BY id DESC limit 1;
+------+---------------------+
| id | created_at |
+------+---------------------+
| 1331 | 2010-05-05 23:18:11 |
+------+---------------------+
1 row in set (0.00 sec)
Works correctly:
mysql> SELECT id, created_at FROM billing_invoices
WHERE (billing_invoices.account_id = 5) ORDER BY created_at DESC ;
+------+---------------------+
| id | created_at |
+------+---------------------+
| 1336 | 2010-05-14 08:05:25 |
| 1334 | 2010-05-06 08:05:25 |
| 1331 | 2010-05-05 23:18:11 |
+------+---------------------+
3 rows in set (0.01 sec)
Works correctly with limit:
mysql> SELECT id, created_at FROM billing_invoices
WHERE (billing_invoices.account_id = 5) ORDER BY created_at DESC limit 1;
+------+---------------------+
| id | created_at |
+------+---------------------+
| 1336 | 2010-05-14 08:05:25 |
+------+---------------------+
1 row in set (0.01 sec)
Additional info:
explain SELECT id, created_at FROM billing_invoices WHERE (billing_invoices.account_id = 5) ORDER BY id DESC limit 1;
+----+-------------+------------------+-------+--------------------------------------+--------------------------------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+--------------------------------------+--------------------------------------+---------+------+------+-------------+
| 1 | SIMPLE | billing_invoices | range | index_billing_invoices_on_account_id | index_billing_invoices_on_account_id | 4 | NULL | 3 | Using where |
+----+-------------+------------------+-------+--------------------------------------+--------------------------------------+---------+------+------+-------------+
Agregado SHOW CREATE billing_invoices tabla de resultados:
Table -- billing_invoices
Create Table --
CREATE TABLE `billing_invoices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account_id` int(11) NOT NULL,
`invoice_date` date NOT NULL,
`prior_invoice_id` int(11) DEFAULT NULL,
`closing_balance` decimal(8,2) NOT NULL,
`note` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`monthly_invoice` tinyint(1) NOT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_billing_invoices_on_account_id` (`account_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1337 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
añadido más:
ahora veo que en mi máquina de desarrollo, todo está funcionando correctamente. Esa máquina tiene la versión VERSION() de 5.1.26-rc-log
En mi máquina de producción , donde está el problema, veo que VERSION() devuelve 5.1.26-rc-Percona-Log
Entonces, ¿en este punto, estoy pensando que el problema es con el software Percona?
añadido más:
En este punto, voy a considerarlo un error en el controlador Percona InnoDB. He puesto un question to their forum. Como solución inmediata, voy a ordenar por created_at. También investigaré la actualización de la base de datos en mi sistema y veré si eso ayuda.
Gracias a Rabbott y mdma por su ayuda. También aprecio la ayuda que no estoy haciendo algo tonto, esto realmente es un problema.
favor incluya los resultados de la siguiente pregunta en su pregunta: 'SHOW CREATE TABLE billing_invoices;'. – Asaph
Muy extraño. Probé una consulta similar en mi servidor mysql y funciona justo cuando uso order by primary_id DESC limit 1 ... mi ID principal es una int autogenerada ... parece un error en su servidor ... –