Странности оптимизации LIMIT и ORDER BY.

_RVK_

Новичок
Странности оптимизации LIMIT и ORDER BY.

SELECT * FROM dbtree AS t1, ads AS t2 WHERE (t1.cleft BETWEEN 3 AND 4) AND (t1.clevel=2) AND (t1.id=t2.id_tree) ORDER BY t2.date DESC LIMIT 2

Сколько записей должен выдать такой запрос? Ага, две(без лимита 3). А выдает 1. И только для LIMIT 5 получаю 3 записи.

Привожу дамп базы. Для того что бы могли посмотреть и убедится.
Обратите внимания что в таблицах нет ни одного индекса (кроме PRIMARY). Когда я создаю все необходимые индексы, все работает как и должно.

Можно ли такое поведение MySQL считать багом? Я так понимаю это ошибки в оптимизации запросов с LIMIT и ORDER BY.

PHP:
CREATE TABLE ads (
id int(4) AUTO_INCREMENT NOT NULL, 
date int(11), 
id_tree int(11), 
PRIMARY KEY(id)
);
#
# Dumping data for table ads
#
INSERT INTO ads VALUES(10, 1102682771, 76);
INSERT INTO ads VALUES(6, 1102682702, 75);
INSERT INTO ads VALUES(7, 1102682777, 75);
INSERT INTO ads VALUES(8, 1102682822, 75);
INSERT INTO ads VALUES(9, 1102683714, 76);

#Table structure for table dbtree

CREATE TABLE dbtree (
id int(10) unsigned AUTO_INCREMENT NOT NULL, 
cleft int(11), 
cright int(11), 
clevel int(11), 
PRIMARY KEY(id)
);
#
# Dumping data for table dbtree
#
INSERT INTO dbtree VALUES(1, 1, 28, 0);
INSERT INTO dbtree VALUES(79, 15, 16, 2);
INSERT INTO dbtree VALUES(78, 13, 14, 2);
INSERT INTO dbtree VALUES(77, 7, 8, 2);
INSERT INTO dbtree VALUES(73, 24, 25, 1);
INSERT INTO dbtree VALUES(74, 26, 27, 1);
INSERT INTO dbtree VALUES(75, 3, 4, 2);
INSERT INTO dbtree VALUES(70, 18, 19, 1);
INSERT INTO dbtree VALUES(69, 12, 17, 1);
INSERT INTO dbtree VALUES(71, 20, 21, 1);
INSERT INTO dbtree VALUES(72, 22, 23, 1);
INSERT INTO dbtree VALUES(32, 2, 9, 1);
INSERT INTO dbtree VALUES(33, 10, 11, 1);
INSERT INTO dbtree VALUES(76, 5, 6, 2);
 

_RVK_

Новичок
Кстати, кто нить может посмотреть как на такой запрос отреагирует PostgreSQL. Вроде он должен его скушать.
 

_RVK_

Новичок
neko
С моими данными? Дело в том что глюк, почему-то не проявился на других данных. Закономерности не заметил....
4.0.4 beta-max-debug
 

neko

tеam neko
_RVK_
да с твоими
думаешь я сам начал быстренько писать данные тут? :)

Your MySQL connection id is 3 to server version: 4.0.18-max-debug
 

si

Administrator
SELECT * FROM dbtree AS t1
WHERE (t1.cleft BETWEEN 3 AND 4) AND (t1.clevel=2)

возвращает 1 запись с id=75, таких записей в ads ровно 3

с лимитом у меня 2 возвращает, версия 4.0.22
 

_RVK_

Новичок
mysql> use test
Database changed
mysql> SELECT * FROM dbtree AS t1, ads AS t2 WHERE (t1.cleft BETWEEN 3 AND 4) A
ND (t1.clevel=2) AND (t1.id=t2.fk) ORDER BY t2.date DESC LIMIT 0, 2
-> ;
+----+-------+--------+--------+----+------------+------+
| id | cleft | cright | clevel | id | date | fk |
+----+-------+--------+--------+----+------------+------+
| 75 | 3 | 4 | 2 | 8 | 1102682822 | 75 |
+----+-------+--------+--------+----+------------+------+
1 row in set (0.00 sec)
 
Сверху