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.
Proszę zawierać wyniki następujące zapytanie w twoim pytaniu: 'POKAŻ CREATE TABLE billing_invoices;'. – Asaph
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 ... –