2010-05-16 43 views
8

MySQL ver 5.1.26MySQL: Postanowienie o ograniczenie i daje niepoprawny Wynik

Dostaję zły wynik z select, że ma gdzie klauzule ORDER BY i granicznych. To jest tylko problem, gdy zamówienie przez używa kolumny id.

Widziałem instrukcję MySQL dla LIMIT Optimization

Domyślam od przeczytaniu instrukcji jest to, że istnieje jakiś problem ze wskaźnikiem na klucz podstawowy, ID. Ale nie wiem, gdzie powinienem się udać ...

Pytanie: co powinienem zrobić, aby jak najlepiej rozwiązać problem?

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 | 
+----+-------------+------------------+-------+--------------------------------------+--------------------------------------+---------+------+------+-------------+ 

Dodany SHOW CREATE TABLE billing_invoices wyniki:

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 

Dodano więcej:

Teraz widzę, że na moim komputerze deweloperskim, wszystko działa poprawnie. Że maszyna ma wersja wersja (5.1.26) z-RC-log

Na moim produkcja maszynie, gdzie problem jest, widzę, że wersja() zwraca 5.1.26-rc-percona-log

W tym momencie myślę, że problem dotyczy oprogramowania percona?

Dodany więcej:

W tym momencie mam zamiar to błąd w sterowniku Percona InnoDB rozważenia. Umieściłem question to their forum. Jako natychmiastowe obejście zamawiam przez created_at. Zbadam również aktualizację db w moim systemie i zobaczę, czy to pomaga.

Dziękuję firmie Rabbott i mdma za pomoc. Doceniam też pomoc, że nie robię czegoś głupiego, to naprawdę jest problem.

+4

Proszę zawierać wyniki następujące zapytanie w twoim pytaniu: 'POKAŻ CREATE TABLE billing_invoices;'. – Asaph

+0

Bardzo dziwne. Przetestowałem podobne zapytanie na moim serwerze mysql i działa ono tylko wtedy, gdy używam polecenia przez primary_id DESC limit 1 ... mój główny id jest autogenerated int ... wydaje się jak błąd na serwerze ... –

Odpowiedz

2

Może to być błąd, który nigdy nie został rozwiązany dla zaktualizowanej wersji? http://bugs.mysql.com/bug.php?id=31001

Używam lokalnie 5.1.42. Kopiuję i wklejałem twoje zapytania od góry i otrzymuję wszystkie poprawne wyniki. Czy to jest błąd wspomniany powyżej, czy nie, to brzmi jak błąd i wygląda na to, że został naprawiony w nowszym wydaniu niż twoje ..

+0

Wierzę, że zmiana kolejności jest zamierzona - ponieważ zarówno id, jak i created_at reprezentują równoważne porządki, zmiana kolumny ORDEY BE pomiędzy tymi dwoma nie powinna wpływać na wynik (chyba że zachowuje się pewna kolumna id). – mdma

+0

@Rabbott Wiem, że jestem zamawianie przez id w jednym, created_at w innym - to jest mój cel, wynik limitu 1 dla porządku id jest niepoprawny, dla created_at jest dobrze ... –

+0

A co się stanie, gdy użyjesz mojej sugestii, po prostu dla datapoint, aby pomóc określić, czy jest to typ kolumny/indeksu. – Rabbott

3

Wydaje się dziwne, może błąd? Jako warsztat możesz dokonać wyboru jawnie - użyj podkwerendy, aby wybrać MAX (id) i przefiltruj to w klauzuli WHERE. Na przykład.

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

Po prostu wypróbowałem to i zadziałało twoje zapytanie, podając id 1336. Ale zapytanie jest tworzone przez Rails, więc naprawdę muszę dostać się do podstawowego problemu z db. –

+0

Podobnie jak inne plakaty zauważyłem, że brzmi jak błąd. Ponieważ używasz dość starej wersji, więc zaktualizuję ją, zanim spróbuję czegoś innego. – mdma

1

Stąd

Bug Details

Wydaje się, że została ustalona na 5,1.28:

[22 lip 2008 20:34] Błędy systemowe

wsuwane 5.1.28

Jednak ja widząc ten sam problem w mojej wersji: 5.1.41-3ubuntu12.8

Powiązane problemy