SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.02.2011 08:51:47

oklas
Участник
Зарегистрирован: 13.02.2011
Сообщений: 3

Производительность ANY в MySQL 6.0 и меньших

Несмотря на предупреждение что experimental, система у меня тоже experimental, решил я использовать MySQL 6.0 на FreeBSD 7.2. Прошло время, апгрейдим до FreeBSD 8.1. В процессе апгрейда портов (а также ядра и мира), выяснилось что MySQL 60 вроде как нет и не будет, что они там делят dntknw, - ладно поставил 55, и затем попробовал 51, тоже самое. Собственно в младших версиях MySQL оказывается тормозит корелированный запрос ANY.

На домашнем компе K7 под виртуалкой осталась MySQL 60, таблицу туже туда еле загрузил, вобщем результаты:

Сначала конфигурация:

HOME:
CPU: AMD K7 processor (1750.50-MHz 686-class CPU)
FreeBSD home 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Fri Jun  4 20:00:59 MSD 2010     user@home:/usr/obj/usr/src/sys/VMKERNEL  i386
mysql  Ver 14.15 Distrib 6.0.10-alpha, for portbld-freebsd7.2 (i386) using  5.2

WORK:
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 3800+ (2009.13-MHz K8-class CPU)
FreeBSD work 8.2-RC3 FreeBSD 8.2-RC3 #0: Mon Feb  7 21:31:45 MSK 2011     user@work:/usr/obj/usr/src/sys/BSDKERNEL  amd64
mysql  Ver 14.14 Distrib 5.5.8, for FreeBSD8.2 (amd64) using  EditLine wrapper

индексы:
+--------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| source |          0 | PRIMARY        |            1 | id          | A         |       25351 |     NULL | NULL   |      | BTREE      |         |               |
| source |          1 | dest_source_id |            1 | dest_id     | A         |       25351 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

mysql>  select * from source where (dest_id,id) = any ( select dest_id,max(id) from source group by dest_id ) limit 100; (400, 1000)

HOME:
100 rows in set (0.02 sec)
400 rows in set (0.03 sec)
1000 rows in set (0.05 sec)

WORK:
100 rows in set (4.88 sec)
400 rows in set (12.64 sec)
1000 rows in set (2 min 18.96 sec)

   8 - [  ~  ]

однако:

mysql>  select dest_id,max(id) from source group by dest_id limit 1000;

HOME:
1000 rows in set (0.01 sec)

WORK:
1000 rows in set (0.00 sec)

MySQL установил как есть, ничего не настраивал, только запустил mysql_install_db.

1. ставить 60 через csup, я не замечал, но говорят проблемы: http://lists.freebsd.org/pipermail/free … 2009-No...
2. настройка какая-то нужна?
3. по другому запрос записать?
4. мож патч какой есть, наверняка что нибудь специально тормозит

Переход на PostgreSQL желателен только в крайнем случае.
Комментарии и мнения, советы... Заранее Спасибо.

Неактивен

 

#2 14.02.2011 01:05:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Производительность ANY в MySQL 6.0 и меньших

EXPLAIN от запросов покажите? Скорее всего, просто подзапрос в 5.1 считается
зависимым, а в шестерке очень много патчей на оптимизацию подзапросов.

Неактивен

 

#3 15.02.2011 14:56:17

oklas
Участник
Зарегистрирован: 13.02.2011
Сообщений: 3

Re: Производительность ANY в MySQL 6.0 и меньших

Спасибо за ответ
Действительно на 5.5 подзапрос воспринимается как зависимый, а на 6.0 все в порядке. но проблема в том что непонятно что происходит с 6.0, ее нельзя поставить на FreeBSD по крайней мере из портов ее убрали, сказано что deprecated 1, 2 как пишется: 'use 5.5 instead', невсегда возможно.
Как я понимаю патчи на подзапросы в отдельном виде для 5.5 не существуют. остается или перелопачивать проект, ждать версию или переходить на другую субд.

Хотелось бы знать известно ли что либо о дальнейшей судьбе mysql как будет развиваться и когда может появиться очередная версия или патчи?
Заранее спасибо

Неактивен

 

#4 15.02.2011 16:29:26

oklas
Участник
Зарегистрирован: 13.02.2011
Сообщений: 3

Re: Производительность ANY в MySQL 6.0 и меньших

PS:

На 5.5:

mysql> explain extended select * from source where (dest_id,id) = any ( select dest_id,max(id) from source group by dest_id) limit 10;                    +----+--------------------+--------+-------+---------------+-------------------+---------+------+-------+------------+-------------+
| id | select_type        | table  | type  | possible_keys | key               | key_len | ref  | rows  | filtered   | Extra       |
+----+--------------------+--------+-------+---------------+-------------------+---------+------+-------+------------+-------------+
|  1 | PRIMARY            | source | ALL   | NULL          | NULL              | NULL    | NULL | 24169 |     100.00 | Using where |
|  2 | DEPENDENT SUBQUERY | source | index | NULL          | source_dest_id    | 5       | NULL |     1 | 2416900.00 | Using index |
+----+--------------------+--------+-------+---------------+-------------------+---------+------+-------+------------+-------------+

На 6.0:

mysql> explain extended select * from source where (dest_id,id) = any ( select dest_id,max(id) from source group by dest_id) limit 100;
+----+-------------+--------+-------+---------------+-------------------+---------+------+-------+----------+-------------+
| id | select_type | table  | type  | possible_keys | key               | key_len | ref  | rows  | filtered | Extra       |
+----+-------------+--------+-------+---------------+-------------------+---------+------+-------+----------+-------------+
|  1 | PRIMARY     | source | ALL   | NULL          | NULL              | NULL    | NULL | 25333 |   100.00 | Using where |
|  2 | SUBQUERY    | source | index | NULL          | source_dest_id    | 5       | NULL | 25333 |   100.00 | Using index |
+----+-------------+--------+-------+---------------+-------------------+---------+------+-------+----------+-------------+


многократно дублировать данные придется. и программно все перебирать каждый раз.
может есть какое-то обходное решение,  как нибудь запрос переформулировать?

Отредактированно oklas (15.02.2011 16:38:52)

Неактивен

 

#5 21.02.2011 11:48:29

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Производительность ANY в MySQL 6.0 и меньших

Да, нужно переписать запрос так, чтобы он не считался зависимым.
Например, зависимым никогда не может быть запрос, который явля-
ется таблицей:

SELECT s1.* FROM source s1, (SELECT ... GROUP BY dest_id) s2
WHERE s1.id = s2.id AND s1.dest_id = s2.dest_id;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson