Возможно вы искали: 'Destruction Derby'

May 15 2025 19:32:20
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Оптимизация запросов в MySQL (mysql optimization)

Оптимизация запросов в MySQL (mysql optimization)

Ключевые слова: mysql, optimization, (найти похожие документы)

From: Соколов Сергей <2sly@ukrpost.net.>
Newsgroups: http://detail.phpclub.net
Date: Mon, 20 Dec 2004 18:21:07 +0000 (UTC)
Subject: Оптимизация запросов в MySQL

Оригинал: http://detail.phpclub.net/article/mysql_optimize

Оптимизация запросов в MySQL

Соколов Сергей
22.03.2004

Оптимизация - это изменение системы с целью повышения ее быстродействия.

Оптимизацию работы с БД можно разделить на 3 типа:
* оптимизация запросов
* оптимизация структуры
* оптимизация сервера.

Рассмотрим подробнее оптимизацию запросов.

Оптимизация запросов - наиболее простой и приводящий к наиболее
высоким результатам тип оптимизации.


SELECT

Запросами, которые чаще всего поддаются оптимизации, являются запросы
на выборку.

Для того чтобы посмотреть как будет выполняться запрос на выборку
используется оператор EXPLAIN: http://www.mysql.com/doc/ru/EXPLAIN.html
С его помощью мы можем посмотреть, в каком порядке будут связываться
таблицы и какие индексы при этом будут использоваться.

Основная ошибка начинающих - это отсутствие индексов на нужных полях
или создание оных на ненужных полях. Если вы делаете простую выборку
наподобие:

SELECT * FROM table WHERE field1 = 123


То вам нужно проставить индекс на поле field1, если вы используете в
выборке условие по двум полям:

SELECT * FROM table WHERE field1 = 123 AND field2 = 234


То вам нужно создать составной индекс на поля field1, field2.

Если вы используете соединение 2 или более таблиц:

SELECT *
FROM a, b
WHERE a.b_id = b.id


Или в более общем виде:

SELECT *
FROM a
[LEFT] JOIN b ON b.id = a.b_id
[LEFT] JOIN с ON с.id = b.c_id


То вам следует создать индексы по полям, по которым будут
присоединятся таблицы. В данном случае это поля b.id и c.id. Однако
это утверждение верно только в том случае, если выборка будет
происходить в том порядке, в котором они перечислены в запросе. Если,
к примеру, оптимизатор MySQL будет выбирать записи из таблиц в
следующем порядке: c,b,a, то нужно будет проставить индексы по полям:
b.c_id и a.b_id. При связывании с помощью LEFT JOIN таблица, которая
идет в запросе слева, всегда будет просматриваться первой.

Про синтаксис создания индексов можно прочитать в документации:
http://www.mysql.com/doc/ru/CREATE_INDEX.html

Более подробно про использовании индексов можно прочитать здесь:
http://www.mysql.com/doc/ru/MySQL_indexes.html

Иногда бывает такая ситуация, что нам постоянно приходится делать
выборки из одной и той же части некоторой очень большой таблицы,
например, во многих запросах происходит соединение с частью таблицы:

[LEFT] JOIN b ON b.id = a.b_id AND b.field1 = 123 AND b.field2 = 234


В таких случаях может быть разумным вынести эту часть в отдельную
временную таблицу:

CREATE TEMPORARY TABLE tmp_b TYPE=HEAP
SELECT * FROM b WHERE b.field1 = 123 AND b.field2 = 234


И работать уже с ней ( про временные таблицы читайте в документации
http://www.mysql.com/doc/ru/CREATE_TABLE.html).

Также если мы несколько раз рассчитываем агрегатную функцию для одних
и тех же данных, то для ускорения следует сделать такой расчет
отдельно и положить его результат во временную таблицу.

Также бывают тормоза, когда люди пытаются в одном запросе <<поймать
сразу 2-х зайцев>>, например, на форуме phpclub'а автор следующего
запроса спрашивал, почему он тормозит:

SELECT f_m. *, MAX( f_m_v_w.date ) AS last_visited, COUNT( DISTINCT f_b.id ) AS books_num,
IF ( f_m.region != 999, f_r.name, f_m.region_other ) AS region_name
FROM fair_members f_m
LEFT JOIN fair_members_visits_week f_m_v_w ON f_m_v_w.member_id = f_m.id
LEFT JOIN fair_regions AS f_r ON f_m.region = f_r.id
LEFT JOIN fair_books AS f_b ON f_b.pub_id = f_m.id
GROUP BY f_m.id


Автор запроса пытается в одном запросе посчитать максимальное значение
атрибута из одной таблицы и кол-во записей в другой таблице. В
результате к запросу приходится присоединять 2 разные таблицы, которые
сильно замедляют выборку. Для увеличения быстродействия такой выборки
необходимо вынести подсчет MAX'а или COUNT'а в отдельный запрос.

Для подсчета кол-ва строк используйте функцию COUNT(*), c указанием
"звездочки" в качестве аргумента.

Почему COUNT(*) обычно быстрее COUNT(id), поясню на примере:

Есть таблица message: id | user_id | text
с индексом PRIMARY(id), INDEX(user_id)

Нам надо подсчитать сообщения пользователя с заданым $user_id

Сравним 2 запроса:

SELECT COUNT(*) FROM message WHERE user_id = $user_id


и

SELECT COUNT(id) FROM message WHERE user_id = $user_id


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

Для выполнения второго запроса мы сначала проходим по индексу, для
отбора записей удовлетворяющих условию, после чего если запись
попадает под условие, то вытаскиваем ее (запись скорее всего будет на
диске) чтобы получить значение id и только потом инкриментим счетчик.

В итоге получаем, что при большом кол-ве записей скорость первого
запроса будет выше в разы.


UPDATE, INSERT

Скорость вставок и обновлений в базе зависит от размера вставляемой
(обновляемой) записи и от времени вставки индексов. Время вставки
индексов в свою очередь зависит от количества вставляемых индексов и
размера таблицы. Эту зависимость можно выразить формулой:
[Время вставки индексов] = [кол-во индексов] * LOG2( [Размер таблицы] )

При операциях обновления под [кол-во индексов] понимаются только те
индексы, в которых присутствуют обновляемые поля.
Условия в запросах на обновления оптимизируются так же, как и в случае
с выборками.

При частом изменении некоторой большой таблицы с большим количеством
индексов имеет смысл производить вставки в другую небольшую
вспомогательную таблицу с тем же набором полей (но с отсутствием
индексов) и периодически перекидывать данные из нее в основную
таблицу, очищая вспомогательную. При этом следует учесть, что данные
будут выводиться с запозданием, что не всегда может быть возможным.

<<Чтобы удалить все строки в таблице, нужно использовать команду
TRUNCATE TABLE table_name.>> © документация MySQL.

Ответы на многие вопросы по оптимизации запросов можно найти в
мануале: http://www.mysql.com/doc/ru/Query_Speed.html

Комментарии:



>>> SELECT COUNT(*) FROM message WHERE user_id = $user_id
>>> внимательно читаем мануал, прежде чем сравнивать
>>> (http://www.mysql.com/doc/en/GROUP-BY-Functions.html):
>>> COUNT(*) is optimized to return very quickly if the SELECT retrieves
>>> from one table, no other columns are retrieved, and there is no WHERE
>>> clause.

>> Моей задачей было показать почему в общем случае COUNT(*) быстрее. А
>> то что он очень быстро возвращает ко-во строк в таблице - это в мане
>> описано, и я не стал этого повторять.

> ты хоть прочитал отквотированный мной мануал? COUNT(*) быстрее
> _только_ в случае, если не выбираются никакие столбцы и не
> накладывается никаких условий в WHERE. теперь посмотри на свой пример.

Где ты в мануале увидел слово "только"


>>> еще насчет оптимизации INSERT. если предполагается объемная вставка
>>> данных, то в 4 mysql можно перед вставкой сделать ALTER TABLE table
>>> DISABLE KEYS, вставить данные и сделать ALTER .. ENABLE. Такой
>>> механизм специально заточен что бы быстро регенерить индексы после
>>> больших вставок, а не перестраивать индекся после вставки каждой
>>> строки.

>> данных, то в 4 mysql можно перед вставкой сделать ALTER TABLE table
>> DISABLE KEYS, вставить данные и сделать ALTER .. ENABLE. Такой
>> механизм специально заточен что бы быстро регенерить индексы после
>> больших вставок, а не перестраивать индекся после вставки каждой
>> строки.

>> Тут Вы правы, но я имел в виду что данные втавляются разными потоками.
>> Правда в таком случае при вставках можно использовать INSERT DELAED.
>> Возможно стоит этот абзац удалить.

> это надо указывать. INSER DELAYED не поможет проблеме, т.к. рано или
> поздно индексы начнут регенериться после каждого инсерта. что создаст
> нагрузку на сервер. хотя inser delayed решит проблему ожидания клиента
> конца вставки. пользуя insert delayed надо помнить, что мы не получим
> значение автоинкрементного поля, что в некоторых случаях может стать
> проблемой при поиске ошибок в неправильно работающем скрипте. ну и
> надо учитывать, что insert delayed тормознее простого inserta, т.к.
> задание на вставку ставится в очередь, на каждую таблицу выделяется по
> потоку, т.е. не подходит под название статьи, т.к. оптимизация времени
> ответа клиенту не есть оптимизацией запросов.

Здесь с тобой не согласен.
"Еще одно существенное преимущество применения оператора INSERT
DELAYED заключается в том, что данные от многих клиентов собираются
вместе и записываются одним блоком. Это намного быстрее, чем несколько
отдельных операций вставки." (c) Мануал
(http://www.mysql.com/doc/ru/INSERT_DELAYED.html)
370 Прочтений •  [Оптимизация запросов в MySQL (mysql optimization)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Оптимизация запросов в MySQL (mysql... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка