2010-05-16 14 views
8

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.

+4

favor incluya los resultados de la siguiente pregunta en su pregunta: 'SHOW CREATE TABLE billing_invoices;'. – Asaph

+0

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 ... –

Respuesta

2

¿Podría ser este error que nunca se resolvió para su versión actualizada? http://bugs.mysql.com/bug.php?id=31001

Estoy ejecutando 5.1.42 localmente. Copié y pegué tus consultas desde arriba y obtengo todos los resultados correctos. Ya sea el error mencionado anteriormente o no, parece un error, y parece que se ha corregido en un lanzamiento más reciente que el tuyo.

+0

Creo que el el cambio en el orden es intencional, ya que tanto id como created_at representan ordenamientos equivalentes, entonces cambiar la columna ORDEY BE entre estos dos no debería afectar el resultado (a menos que haya algún comportamiento especial en la columna id.) – mdma

+0

@Rabbott Sé que soy ordenar por id en uno, created_at en otro - ese es mi punto, el resultado del límite 1 para el orden de id es incorrecto, para created_at es correcto ... –

+0

Y qué pasa cuando usas mi sugerencia, solo para un punto de datos para ayudar a determinar si es un tipo de columna/problema de índice ... – Rabbott

3

Parece curioso, ¿tal vez un error? Como un workaround, tal vez pueda hacer que la selección sea explícita: use una subconsulta para seleccionar MAX (id) y filtre eso en una cláusula WHERE. P.ej.

SELECT id, created_at FROM billing_invoices 
    WHERE id IN (SELECT MAX(id) FROM billing_invoices WHERE account_id=5) 
+0

Acabo de probarlo y su consulta funcionó, dando ID 1336. Pero la consulta es creada por Rails, así que realmente necesito llegar al problema subyacente con el db. –

+0

Como han notado los otros carteles, parece un error. Como usas una versión bastante antigua, entonces actualizaría antes de probar cualquier otra cosa. – mdma

1

Desde aquí,

Bug Details

Parece que fue fijado en 5,1.28:

[22 Jul 2008 20:34] errores del sistema

empujado en 5.1.28

Sin embargo, estoy notando el mismo problema en mi versión: 5.1.41-3ubuntu12.8

Cuestiones relacionadas