Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: SQL. Выборка. Оптимизация.
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » SQL. Выборка. Оптимизация.

Страниц (1): [1]
 

1. lastdays - 24 Января, 2016 - 09:33:57 - перейти к сообщению
Друзья, привет!

Есть sql запрос:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.  `b`.`id`, `b`.`user`,`b`.`level`,`b`.`pol`,
  3.  `bn`.`uid`,`bn`.`x`,`bn`.`y`,`bn`.`cfight`,`bn`.`time_die`,`bn`.`gr_bot`,`bn`.`nature_id`,
  4.  `fb`.`id`,`fb`.`turn`,`fb`.`type`,
  5.  `ub`.`chp`,`ub`.`cfight`,`ub`.`nature_id`
  6. FROM  `bots` AS `b`
  7. LEFT JOIN  `nature_bots` AS `bn`
  8.  ON (`b`.`id` = `bn`.`uid`)
  9. LEFT JOIN  `fights`  AS `fb`
  10.  ON (`fb`.`id`=`bn`.`cfight` AND `fb`.`type`!='finish')
  11. LEFT JOIN `users_battle` AS `ub`
  12.  ON (`ub`.`cfight` = `fb`.`id` AND `ub`.`nature_id`=`bn`.`nature_id` AND `fb`.`turn`!='finish' AND `fb`.`type`='notf' )
  13. WHERE
  14.  `bn`.`x`=4 AND `bn`.`y`=1



Запрос отработал:
Вариант №1 ( 3 записи )
Отображение строк 0 - 2 (3 всего, Запрос занял 0.0010 сек.)
Вариант №2 ( 1005 записей )
Отображение строк 0 - 49 (1005 всего, Запрос занял 0.0020 сек.)
Вариант №3 (12027 записей )
Отображение строк 0 - 49 (12027 всего, Запрос занял 0.0020 сек.)

Скрипт показывает: Запрос выполнялся 0.00025001502037048 миллисекунд данных: 12027

Все три запроса в среднем 0.0010 сек.

-------------------------------- ----
Все поля таблиц где происходит сравнение имеют одинаковую кодировку, тип.
Cозданы индексы, в каждой таблице это id = AUTO_INCREMENT и атрибут UNSIGNED.
Поля таблиц: id, cfight, nature_id, имеют тип int(11)
turn, type имеют тип varchar(10), вот думаю изменить на тип ENUM
-------------------------------- ----

В чем вопросы ?

- Во-первых меня беспокоит время выполнения запроса, забавно что при огромной разнице оно одинаково.
- Как можно оптимальнее написать запрос, имея ввиду:
Важные данные только в одной таблице (bots), это общая информация.
Все последующие страницы, дополнительная информация, если ничего не найдено, возвращает null.
2. LIME - 24 Января, 2016 - 09:44:27 - перейти к сообщению
lastdays пишет:
вот думаю изменить на тип ENUM
имеет смысл если учавствуют в условиях выборки
иначе пофиг(ну по запросам видно что стоит)
еще есть смысл чтоб ограничить возможные значения при заполнении
lastdays пишет:
забавно что при огромной разнице оно одинаково
смотря что считать огромной разницей
смотри explain
индексам пофиг сколько данных
важнее как они по дереву индексов пробегают
на маленьких данных может не быть разницы либо потому что они маленькие либо потому что индекс удачно построен
поставь себе mysqlworkbench если мускул
в этом инструменте очень хороший визуальный эксплэйн
ну и погугли конечно как вообще пользоваться эксплэйном
ну и на сладкое погугли как устроен BTREE в мускуле
поймешь как правильно индексы строить
ну и совсем на сладкое погугли что есть покрывающие индексы

 

Powered by ExBB FM 1.0 RC1