Как стать автором
Обновить
19.59

MySQL *

Свободная реляционная СУБД

Сначала показывать
Порог рейтинга
Уровень сложности

Краткий обзор движков таблиц MySQL

Время на прочтение3 мин
Количество просмотров78K
Цель этой статьи — дать краткий, очень сжатый обзор движков, для того, чтобы статьей можно было пользоваться при выборе движка на этапе проектирования \ создания \ оптимизации таблицы. Предполагается, что читатель знает суть вопроса по крайней мере поверхностно и способен сам отыскать всю дополнительную информацию (вопросы в комментах можно задавать всегда :) )
Читать дальше →
Всего голосов 123: ↑108 и ↓15+93
Комментарии73

Подсчёт общего количества строк выборке в mySQL при использовании LIMIT

Время на прочтение5 мин
Количество просмотров65K
Один хороший человек хочет попасть на хабр. Для подтверждения своих благих намерений он написал статью, которую я привожу вам.

Наверняка многие знают о существовании в mySQL функции FOUND_ROWS(). Её чаще всего используют для подсчета общего числа строк в таблице, удовлетворяющих заданным условиям. Используют её обычно совместно с директивой SQL_CALC_FOUND_ROWS следующим образом:

Mysql> SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE column > 1 LIMIT 0, 50;
Mysql> SELECT FOUND_ROWS();

Результатом второго запроса будет общее количество строк в таблице «table», удовлетворяющих условию «column > 1» (а не только тех, что были возвращены первым запросом).
Следует учитывать некоторые особенности этой функции, когда используете её без директивы SQL_CALC_FOUND_ROWS, о чём добросовестно предупреждает документация mySQL: в этом случае она вернёт общее количество обработанных строк (не возвращённых!). Например:

Mysql> SELECT * FROM table LIMIT 0, 50;
Mysql> SELECT FOUND_ROWS();

Результатом, как и ожидается, будет «50». Но следующие запросы вернут не слишком ожидаемый результат:

Mysql> SELECT * FROM table WHERE column > 1 LIMIT 50, 50;
Mysql> SELECT FOUND_ROWS();

Несмотря на то, что первый запрос вернёт 50 строк, результатом будет «100», т.к. mySQL пришлось просмотреть именно 100 строк.
Читать дальше →
Всего голосов 67: ↑55 и ↓12+43
Комментарии79

Денормализация БД. Зачем? Когда? Как?

Время на прочтение6 мин
Количество просмотров95K

денормализация — это зло, или просто надо уметь её готовить?


Денормализация- это не результат кривых рук. Это не недоделанная нормализация, это намеренное нарушение нормальных форм, для увеличения производительности.
Вопрос о денормализации у меня возникал не раз. Каждый раз, когда приходилось идти на сделку с совестью, нарушая принципы нормальных форм, оставалось ощущение неудовлетворённости, ложное осознание своей некомпетентности. Со временем, при работе в команде, обнаружилось, что это не только моя проблема. Настало время разобраться: денормализация — это зло, или просто надо уметь её готовить?
Читать дальше →
Всего голосов 33: ↑32 и ↓1+31
Комментарии22

Nested Sets + MySQL TRIGGER

Время на прочтение7 мин
Количество просмотров9.8K

Задача


Задача такая же как и в предыдущей статье, только применимо к MySQL.

Грабли


Хорошая новость ребята! В MySQL нет проблемы с рекурсивными триггерами! Разработчики MySQL просто тупо лочат изменяемую таблицу даже на уровне триггера, вот редиски. Но, собственно, нас может остановить только отключение электричества.
Есть небольшая лазейка, с… объединенными таблицами. Хотя я не нашел в документации подтверждения того, что это так специально было задумано, но и отрицания тоже не было. Правда есть вероятность того, что эту лазейку могут прикрыть, хотя я не вижу в этом смысла.
Увы, механизм триггеров в MySQL новый и довольно сырой, что накладывает некоторые ограничения на его использование, но все же его достаточно для решения нашей задачи.
Читать дальше →
Всего голосов 37: ↑33 и ↓4+29
Комментарии47

Истории

Средства создания горячих BackUp`ов MySQL

Время на прочтение3 мин
Количество просмотров33K
Доброго времени суток. Недавно я задался вопросом о том, как делать горячие BackUp`ы MySQL-серверов — ниже компиляция из прочитанного. Заранее хочу сказать, что данный пост является скорее большой заметкой, чем полноценной статьёй. Я намеренно уклоняюсь от описания синтаксиса — на эту тему уже немало написано — я же ставил перед собой другую цель — составить краткий обзор основных методов с характерными особенностями:
далее
Всего голосов 57: ↑53 и ↓4+49
Комментарии49

Определяем порядок столбцов в составном индексе

Время на прочтение5 мин
Количество просмотров22K
Хочу поделиться простым эмпирическим методом, который я использую для определения того, в каком порядке должны идти столбцы в составном индексе. Этот способ подходит не только для MySQL, он также применим к любым СУБД, в которых используются b-tree индексы.

Давайте начнем с запроса, который возвращает пустой результат, но при этом делает полный скан таблицы. EXPLAIN покажет на нем, что нет доступных индексов (т.е. possible_keys = NULL)

SELECT * FROM tbl
WHERE
  status='waiting' AND
  source='twitter' AND
  no_send_before <= '2009-05-28 03:17:50' AND
  tries <= 20
ORDER BY date ASC LIMIT 1;
Читать дальше →
Всего голосов 52: ↑47 и ↓5+42
Комментарии17

Почему Ларри Эллисон так стремился купить MySQL?

Время на прочтение1 мин
Количество просмотров1.4K
Когда Ларри Эллисон, директор Oracle, объявил в понедельник о покупке компании Sun, он ни словом не обмолвился о MySQL, своём конкуренте на рынке малых СУБД. Именно этот сегмент остаётся непокрытым в продуктовой линейке Oracle. Все хорошо помнят, как страстно Ларри Эллисон жаждал завладеть этой шведской компанией три года назад. В течение всего 2006 года Ларри Эллисон неоднократно предлагал выкупить MySQL, но трое друзей-шведов, основателей MySQL, неизменно отвергали его предложение от «империи зла», взлёт которой произошёл благодаря сотрудничеству с ЦРУ, после чего MySQL в итоге продалась Sun.

Теперь же мечта Эллисона сбылась, и он даже не говорит, что купил Sun только ради MySQL.

В свете всех известных фактов очень странно смотрятся размышления некоторых аналитиков о том, что MySQL не является конкурентом Oracle. Это слишком узкий взгляд на вещи, потому что не принимаются в расчёт долговременные планы Эллисона, а также перспективы развития самой MySQL (например, в версии 5.4 этой СУБД уже появилась поддержка 16-процессорных серверов x86, а по некоторым тестам производительность выросла на 40000%).

Кстати, по странной случайности выход MySQL 5.4 был запланирован на 21 апреля, но за день до этого произошла сделка с Oracle.

via betanews
Всего голосов 55: ↑47 и ↓8+39
Комментарии49

Основы репликации в MySQL

Время на прочтение10 мин
Количество просмотров330K
С репликацией серверов MySQL я познакомился относительно недавно, и по мере проведения разных опытов с настройкой, записывал, что у меня получалось. Когда материала набралось достаточно много, появилась идея написать эту статью. Я постарался собрать советы и решения по некоторым самым основным вопросам, с которыми я столкнулся. По ходу дела я буду давать ссылки на документацию и другие источники. Не могу претендовать на полноту описания, но надеюсь, что статья будет полезной.
Читать дальше →
Всего голосов 72: ↑70 и ↓2+68
Комментарии44

Ускоряем выборку произвольных записей MySQL

Время на прочтение3 мин
Количество просмотров33K
Последнее время оживилась публика с вопросом случайной выборки из таблицы. Решений по оптимизации полно, и нового сейчас я вам наверное ничего не покажу, просто напомню про основные методы оптимизации — упрощение запроса и индексацию. Без предисловий про фриленсеров, сразу к делу ;)

Читать дальше →
Всего голосов 59: ↑50 и ↓9+41
Комментарии22

Хранимые процедуры в MySQL

Время на прочтение2 мин
Количество просмотров27K
По долгу службы приходится глубоко разбираться с сабжем.
К сожалению, это не самое лучшее изобретение человечества, поэтому иногда приходится вбивать костыли, чтобы хоть как-то пользоваться этой штукой.
О костылях
Всего голосов 37: ↑35 и ↓2+33
Комментарии36

Расчет периодов стажа в MySQL

Время на прочтение3 мин
Количество просмотров7.3K
На одном форуме задали вопрос о том, как правильно посчитать разность дат в MySQL для учета стажа сотрудника. На первый взгляд вопрос оказался простым, но при детальном рассмотрении все оказалось куда интереснее.
Читать дальше →
Всего голосов 41: ↑33 и ↓8+25
Комментарии10

MySQL: Хранимые процедуры и динамический SQL

Время на прочтение1 мин
Количество просмотров51K
Если кто-либо из вас пытался сделать вроде бы очевидную вещь, а именно, создать sql запрос внутри процедуры передав ей имя таблицы, пользователя и т.п., то скорее всего натыкались на ошибку, о том, что нельзя использовать динамический sql.

SET @mytable='users';
SELECT * FROM @mytable;

Такая конструкция работать не будет. А что же делать, чтобы она заработала?
Читать дальше →
Всего голосов 69: ↑65 и ↓4+61
Комментарии26

Особенность оптимизатора MySQL 5.1.30 порядок следования таблиц в UPDATE

Время на прочтение1 мин
Количество просмотров977
Добрый день. Я расскажу об одной из забавных особенностей оптимизатора MySQL 5.1.30, которая заставляет перед обновлением внимательно проверить запросы.
Для любопытных: «теперь SET-выражения выполняются не в порядке следования выражений слева направо, а в порядке следования обновляемых таблиц».
Но, всё по порядку.
Всего голосов 45: ↑43 и ↓2+41
Комментарии16

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн

Восстановление базы MySQL из бинарных логов

Время на прочтение2 мин
Количество просмотров43K
Базы данных иногда пропадают. Человеческий фактор и всё-такое… Если вы не делали бекапов (а надо бы) или они уже устарели, не отчаивайтесь, — есть ещё возможность восстановить утерянную информацию.

Подробнее
Всего голосов 65: ↑60 и ↓5+55
Комментарии28

Через год

Время на прочтение1 мин
Количество просмотров1.1K
Может это и правильно, но как-то неожиданно.

select
'2008-02-27' + INTERVAL 1 YEAR, -- 2009-02-27
'2008-02-28' + INTERVAL 1 YEAR, -- 2009-02-28
'2008-02-29' + INTERVAL 1 YEAR, -- 2009-02-28
'2008-03-01' + INTERVAL 1 YEAR; -- 2009-03-01


UPD По результатам обсуждения резюмирую:
а) это стандартное поведение и других СУБД и более того
б) данный способ расчета годового периода узаконен и применяется в офлайн.
Всего голосов 79: ↑64 и ↓15+49
Комментарии58

Представления (VIEW) в MySQL

Время на прочтение10 мин
Количество просмотров454K
В комментариях Хабра упоминались вопросы по использованию представлений. Данный топик является обзором представлений, появившихся в MySQL версии 5.0. В нем рассмотрены вопросы создания, преимущества и ограничения представлений.

Что такое представление?


Представление (VIEW) — объект базы данных, являющийся результатом выполнения запроса к базе данных, определенного с помощью оператора SELECT, в момент обращения к представлению.

Представления иногда называют «виртуальными таблицами». Такое название связано с тем, что представление доступно для пользователя как таблица, но само оно не содержит данных, а извлекает их из таблиц в момент обращения к нему. Если данные изменены в базовой таблице, то пользователь получит актуальные данные при обращении к представлению, использующему данную таблицу; кэширования результатов выборки из таблицы при работе представлений не производится. При этом, механизм кэширования запросов (query cache) работает на уровне запросов пользователя безотносительно к тому, обращается ли пользователь к таблицам или представлениям.
Читать дальше →
Всего голосов 105: ↑104 и ↓1+103
Комментарии22

Блокировки в MySQL

Время на прочтение4 мин
Количество просмотров109K
На хабре часто обсуждаются принципы работы MySQL. Данный хабратопик посвящен механизмам блокировок, используемым в MySQL. Топик поможет начинающим изучать MySQL и, в некоторой степени, опытным хабралюдям.

Механизм блокирования в MySQL


Одновременный доступ нескольких клиентов к хранилищу данных может приводить к ошибкам различного типа. Например, одновременное чтение одним клиентом и запись другим клиентом одной и той же строки таблицы с большой вероятностью приведет к сбою или чтению некорректных данных. Механизмы блокировок позволяют избежать ситуаций одновременного доступа к данным, регламентируя механизм взаимодействия пользователей между собой.
Читать дальше →
Всего голосов 65: ↑62 и ↓3+59
Комментарии18

Курсоры в Mysql.

Время на прочтение6 мин
Количество просмотров111K
По долгу службы мне пришлось сталкиваться с курсорами. Хотелось бы рассказать, что это такое и о некоторых особенностях работы с ними. Официальная документация тут — dev.mysql.com/doc/refman/5.1/en/cursors.html Википедия даёт такое определение курсору курсор:
Читать дальше →
Всего голосов 44: ↑40 и ↓4+36
Комментарии13

Хранение файлов в MySQL и их быстрая раздача

Время на прочтение3 мин
Количество просмотров97K
Думаю у многих возникала необходимость хранить файлы, связанные с записью в таблице. Это может быть картинка к новости, аватар, загруженный пользователем файл — да все, что угодно. Обычно в этому случае поступают просто — файл ложится в файловую систему, а ссылка на него — в запись БД.
Но у такого классического похода множество недостатков:
  • файлы не удаляются при удалении соответствующей записи БД
  • проблемы при одновременной попытке обновления файла
  • нарушение синхронизации между БД и файловой системой при откате транзакции
  • при резервном копировании и восстановлении информации в БД может возникнуть рассинхронизация с файловой системой
  • файлы не подчиняются ограничениям доступа, наложенным с помощью БД

Больше о проблемах, возникающих при хранении файлов отдельно от БД можно почитать в презентации SQL Antipatterns, раздел Phantom Files, страница 60. Кстати, автор презентации предлагает решение — хранить файлы прямо в БД, в поле типа BLOB. Правда следует замечание, что это должно быть взвешенное решение в каждом конкретном случае. Ведь при таком способе хранения файлов вебсервер должен при каждом запросе вызывать некий скрипт, который будет извлекать файл из БД и отдавать пользователю, что неминуемо отрицательно скажется на производительности.
Для поиска решения данной проблемы был проведен мозговой штурм и придумано несколько вариантов решения проблемы:
Читать дальше →
Всего голосов 71: ↑59 и ↓12+47
Комментарии99

Kaj Arnö: MySQL и Sun — как дела?

Время на прочтение2 мин
Количество просмотров791
Кай Арно

Кай Арно, вице-президент MySQL AB по работе с сообществом пользователей — удивительный человек.

Он родом из Финляндии, а сам по происхождению швед (и похож этим на Линуса Торвальдса).
Он любит Россию, но не знает русского. Это не мешает ему вести свой блог на русском языке — blogs.arno.fi/fandorin.
Для этого он пишет текст на английском, переводит его на русский через Google Translate, и если в обратном переводе с русского на английский ещё что-то можно понять — публикует. Получается неплохо.

В 2001 году он продал MySQL AB половину своей компании, занимающуюся обучением MySQL, и с тех пор работал в корпорации вице-президентом по консалтинговым услугам, вице-президентом по разработке, и в итоге, с 2005 года — вице-президентом по связям с с пользовательским сообществом.

С тех пор как Sun купила MySQL AB в феврале этого года, Кай ездит по всему миру и помогает разработчикам, клиентам и сообществам пользователей Sun и MySQL найти общий язык и научиться сосуществовать в гармонии.

На днях Кай Арно приезжает в Москву и будет рассказывать о том, какой будет новая жизнь MySQL и каковы перспективы его развития при поддержке Sun — компании, которая известна своей благосклонной к opensource-сообществу политикой.

Встречу с Каем организует московская группа пользователей MySQL при поддержке клуба «Бизнес в стиле .RU».
Встреча начнется сегодня, в понедельник 1 декабря в 19-00 в Москве в здании Высшей школы экономики на улице Мясницкой, дом 20, в аудитории 124.

Времени чтобы зарегистрироваться на встречу осталось очень мало, но ещё можно успеть — для этого надо заполнить форму по адресу reg.styleru.net/registration/mmug.

Помимо Кая на встрече выступит Константин Осипов — лидер команды разработчиков ядра MySQL. Он поделится откровениями о том, что нового будет в MySQL 6.0 и расскажет о различных хитростях оптимизации работы версии 5.1, которая на прошлой неделе наконец-то вышла из статуса беты и обрела статус Generally Available.

Итак!
1. Регистрируемся.
2. Приходим к 19-00.
3. Показываем документ (паспорт, водительское удостоверение, студенческий билет, что угодно, где есть ваше имя и фамилия).
4. Проходим по указателям до аудитории и общаемся с докладчиками!
Всего голосов 56: ↑47 и ↓9+38
Комментарии28

Вклад авторов