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

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

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

Вы не зашли.

#1 30.03.2010 12:48:51

RizaR
Участник
Зарегистрирован: 26.03.2010
Сообщений: 5

Разные версии mysql - разные результаты

Добрый день!
Имеется база данных вида:


CREATE TABLE `TABLE1` (
  `c_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `from_id` bigint(6) DEFAULT NULL,
  `to_id` bigint(6) DEFAULT NULL,
  `s_v_t` varchar(255) DEFAULT NULL,
  `s_v_d` varchar(255) DEFAULT NULL,
  `s_n` varchar(255) DEFAULT NULL,
  `s_t` varchar(255) DEFAULT NULL,
  `s_d` varchar(255) DEFAULT NULL,
  `s_v_t` varchar(255) DEFAULT NULL,
  `g_v_d` varchar(255) DEFAULT NULL,
  `g_t` varchar(255) DEFAULT NULL,
  `g_d` varchar(255) DEFAULT NULL,
  `m_t` varchar(255) DEFAULT NULL,
  `m_d` varchar(255) DEFAULT NULL,
  `m_n` varchar(255) DEFAULT NULL,
  `f_o_e` tinyint(1) unsigned DEFAULT NULL,
  `f_status` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `s_l_e` datetime DEFAULT NULL,
  `g_l_e` datetime DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `deleted` datetime DEFAULT NULL,
  `void` tinyint(1) unsigned DEFAULT '0',
  PRIMARY KEY (`c_id`),
  KEY `s_v_d` (`s_v_d`),
  KEY `s_d` (`s_d`),
  KEY `g_v_d` (`g_v_d`),
  KEY `m_d` (`m_d`),
  KEY `to_id` (`to_id`),
  KEY `from_id` (`from_id`),
  KEY `g_d` (`g_d`),
  KEY `cv` (`void`,`f_status`)
) ENGINE=MyISAM AUTO_INCREMENT=269667 DEFAULT CHARSET=cp1251




SHOW CREATE TABLE `TABLE2`

CREATE TABLE `TABLE2` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `c_id` int(10) unsigned DEFAULT NULL,
  `m_id` char(10) DEFAULT NULL,
  `places` int(3) unsigned NOT NULL DEFAULT '0',
  `weight` float(7,2) unsigned NOT NULL DEFAULT '0.00',
  `f_fin` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `void` tinyint(1) NOT NULL DEFAULT '0',
  `c_void` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `iCarting` (`c_id`),
  KEY `iVoid` (`void`)
) ENGINE=MyISAM AUTO_INCREMENT=380356 DEFAULT CHARSET=cp1251

Имеется запрос вида:
Запрос:
EXPLAIN SELECT * FROM `TABLE1` LEFT JOIN TABLE2 ON (TABLE1.`c_id` = TABLE2.`c_id`) WHERE TABLE1.`void` = 0 AND TABLE2.`void` = 0 AND TABLE1.`f_status` < 3 ORDER BY TABLE1.`c_id` DESC LIMIT 0, 20

База данных стоит в 2 местах, на домашнем компе и на хостинге.


Дома:

SELECT VERSION();
5.1.40-community

EXPLAIN SELECT * FROM `TABLE1` LEFT JOIN TABLE2 ON (TABLE1.`c_id` = TABLE2.`c_id`) WHERE TABLE1.`void` = 0 AND TABLE2.`void` = 0 AND TABLE1.`f_status` < 3 ORDER BY TABLE1.`c_id` DESC LIMIT 0, 20

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     TABLE1     index     PRIMARY,cv     PRIMARY     4     NULL     160     Using where
1     SIMPLE     TABLE2     ref     iCarting,iVoid     iCarting     5     co23.TABLE1.c_id     1     Using where


На хосте
SELECT VERSION();
4.1.25-log

EXPLAIN SELECT * FROM `TABLE1` LEFT JOIN TABLE2 ON (TABLE1.`c_id` = TABLE2.`c_id`) WHERE TABLE1.`void` = 0 AND TABLE2.`void` = 0 AND TABLE1.`f_status` < 3 ORDER BY TABLE1.`c_id` DESC LIMIT 0, 20



id      select_type     table   type    possible_keys   key     key_len         ref     rows    Extra

1       SIMPLE  Cartings        ref     PRIMARY,cv      cv      2       const   51512   Using where; Using filesort
1       SIMPLE  Carting_manifests       ref     iCarting,iVoid  iCarting        5       wwwdimexcorpru01.Cartings.carting_id    1       Using where


Получаются 2 совершенно разных результата. Как возможно оптимизировать бд-ху, чтобы работало также как и на 5 версии.
И какие еще способы оптимизации здесь  (не считая перепроектирования БД-хи) возможны?

Неактивен

 

#2 31.03.2010 00:12:10

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

Re: Разные версии mysql - разные результаты

Ну, я вижу, что EXPLAIN одинаковые, но на хостинге больше строк. Что Вас
смущает?

На будущее: или везде меняйте Cartings -> table1, или не делайте усложнение,
мысленно подставлять значения куда хуже, а оглашение названия таблиц не
ухудшает безопасность системы smile

Неактивен

 

#3 31.03.2010 09:37:27

RizaR
Участник
Зарегистрирован: 26.03.2010
Сообщений: 5

Re: Разные версии mysql - разные результаты

>На будущее: или везде меняйте Cartings -> table1,
Не все углядел, извините.

Меня смущает то, что на хосте:
1) Using filesort
2) Идет переобор гораздо большего количества строк (150 дома vs 51512 на хосте), хотя база одна и та же фактически...

Отредактированно RizaR (31.03.2010 09:39:23)

Неактивен

 

#4 31.03.2010 12:32:14

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

Re: Разные версии mysql - разные результаты

Ну, filesort есть и там, и там. Просто дома меньше данных в самих табличках — оттуда
и разное количество строк для сортировки.

А сам explain, конечно, плохой, и лучше бы использовать индексы smile

Неактивен

 

#5 31.03.2010 15:14:34

RizaR
Участник
Зарегистрирован: 26.03.2010
Сообщений: 5

Re: Разные версии mysql - разные результаты

Дома почти столько же данных в самих табличках, т.е где-то 51312 было бы.

Неактивен

 

#6 31.03.2010 15:28:40

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

Re: Разные версии mysql - разные результаты

А, все, вижу, он выбирает разные ключи для первой таблички.

Тогда только FORCE INDEX sad
Ну и прийдется, видимо, дома ставить 4.1, раз у него так сильно оптимизатор на
этом запросе отличается...

Неактивен

 

Board footer

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