Как стать автором
Поиск
Написать публикацию
Обновить
4.68

MySQL *

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

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

Микрозаметка: Итераторы/Генерация диапазонов дат, чисел и тд

Время на прочтение3 мин
Количество просмотров1.7K
Эта заметка навеяна топиком "подсчет количества событий календаря в каждом месяце года". В ней нет ничего нового, это просто микрозаметка о возможных решениях.
Хотя задача того топика очень типична и вполне спокойно решалась обычным проходом с case или if:
SELECT
sum(
 CASE
  when t.`start_date`<'2010-02-01' and t.end_date>'2010-01-01'   then 1
  else 0
 end
)
AS jan,
sum(
 CASE
  when t.`start_date`<'2010-03-01' and t.end_date>'2010-02-01'   then 1
  else 0
 end
)
AS feb,
...
FROM test t


Но я счел нужным написать о некоторых возможностях избежать излишнюю ручную работу. Например, если нам необходимо бы было агрегировать не за год и не за два, а, скажем, за последние 5 лет помесячно. Согласитесь, в таком случае 60 строк c if'ами было бы как минимум тяжело читать.
Читать дальше →

Подсчет количества событий календаря в каждом месяце года

Время на прочтение4 мин
Количество просмотров4.8K
Постановка задачи:
вывести количество событий (events) каждого месяца года.

Каждое событие имеет два поля
— start_date — дата начала события
— end_date — дата завершения события

Структура таблички с событиями календаря:
CREATE TABLE `events` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `start_date` date default NULL,
  `end_date` date default NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


Читать дальше →

MySQL шпаргалки

Время на прочтение3 мин
Количество просмотров827K
Часто, когда разрабатываешь сайт, замечаешь, как на одни и те же грабли наступают разработчики при проектировании базы данных.

Сегодня я решил опубликовать свои шпаргалки, на самые часто встречающиеся ошибки при работе с MySQL.

Читать дальше →

How To настроки репликации в MySQL с использованием шифрования SSL на Debian Lenny

Время на прочтение7 мин
Количество просмотров14K
Это руководство описывает, как настроить репликацию базы данных в MySQL с использованием SSL соединение для шифрования.
MySQL репликация синхронизирует базу данных, что позволяет иметь точную копию БД на другом сервере. Все обновления БД на главном сервере автоматически реплицируются на другой сервер, что позволяет защитить базу от аппаратных сбоев. В этой статье будет показано, как реализовать репликации БД exampledb с сервера server1.example.com(ip адресом 192.168.0.100) на сервер server2.example.com(ip адресом 192.168.0.101) с использованием SSL соединения
Читать дальше →

MySQL в tmpfs

Время на прочтение5 мин
Количество просмотров14K
Хотелось бы поделиться опытом по использованию MySQL с хранением данных в памяти, а не на диске. Это позволило нам сократить load average сервера, который из-за операций с диском стал сильно расти.



Читать дальше →

Модель документо-ориентированной БД в реляционной СУБД

Время на прочтение3 мин
Количество просмотров3.5K
Область применения: достаточно статические структурированные массивы данных, построенные (хотя не обязательно) на основе справочников.

Вид инструмента: система управления данными (CMS) для web приложений.

Реализация: PHP, MySQL.

С точки зрения конечного пользователя, все возможные варианты технической реализации представляется сложным или простым GUI, в котором он может внести тот или иной набор данных. Какой бы GUI не был бы, он ограничен применяемыми элементами ввода данных (контролами): input, select, file, text etc. Этот набор данных описывает документ (запись) и является набором его свойств. Исходя из допустимых вариантов контролов, свойства могут или иметь числовое значение id другого элемента (справочник), или могут описываться текстом.

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

С теоретизированием покончено, поехали.

Таблица первая и главная — хранение самих объектов (документов, записей).
Хранение документов в БД самое простое — каждому новому документу присваивается id, id родительского элемента, текстовое поле для хранения свойств и некоторое количество доп полей о которых позже.

id Название свойства родитель доп_поля
1 Запись_1 xml_свойтва 0 доп_поля
2 Запись_2 xml_свойтва 0 доп_поля
3 Запись_3 xml_свойтва 2 доп_поля
4 Запись_4 xml_свойтва 2 доп_поля

Хранить свойства можно любым способом: от банальных разделителей; и | до json и xml.
Мной был выбран xml по причине простых механизмов работы с ним на PHP и реализации xPath в MySQL

Будем считать, что каждый документ описывается набором свойств заданным в некотором шаблоне — Контент Шаблоне (КШ).
Следующая таблица — таблица описывающая наборы свойств для документов (КШ). В таблице есть текстовое описание шаблона, и подчиненное ему произвольное количество табов, которым в свою очередь может быть подчинено произвольное количество полей.

Название_КШ
Таб_1
поле_1 Текстовое
поле_2 Список
поле_3 Дата

К каждой записи в главной таблице привязывается какой именно КШ с данными к ней относится.

Естественно, что кроме данных необходимо некоторое представление этих данных для пользователя на сайте (не забываем, что мы стоим CMS).
Следующая таблица — таблица описывающая Дизайн Шаблон (ДШ) представления данных из Контент Шаблона. ДШ может быть построен на основе любого шаблонизатора. Мы используем примитивную смесь PHP и HTML.

Теперь давайте вспомним об ограничениях, которые мы наложили и вернемся к дополнительным полям.
Ну, во-первых, в дополнительные поля попадают id относящихся к записи КШ и ДШ. Кроме того, в КШ можно задавать часть полей для хранения не в xml, а непосредственно в таблице БД (типа link1, link2, link3). Этих полей по несколько штук на допустимые в MySQL типы данных — текст, числа, даты.
В дополнительные поля попадают ключевые слова и описания документов, а также информация о правах доступа различных пользователей.

Какие достоинства такого подхода:
простой и гибкий механизм настройки шаблонов вводя данных для неквалифицированного оператора.
получив запись по id одним запросом из БД достается максимальное количество её свойств.
возможность использовать механизм xPath для работы c XML в MySQL.

Какие есть недостатки:
невозможность нативной сортировки по данным, лежащим в XML при хранении в MySQL
медленная выборка по конструкции LIKE ‘%’

Описан принцип, хотя есть полностью реализованная CMS на которой работает рад достаточно крупных проектов.,

mysql-proxy тестирование под мелкоскопом

Время на прочтение2 мин
Количество просмотров8.8K
mysql-proxy — практически идеальное решение для тех, кому нужен дешевый шардинг без переписывания приложений, а также хостинг провайдерам, которым сложно контролировать криворуких клиентов :) но хотелось бы вынести mysql или снизить нагрузку на СУБД без лишних контактов с клиентами.

Итак, есть задача, облегчить жизнь mysql серверу. Доступное решение — master-slave репликация. Всё замечательно, когда у нас есть программисты, которые могут переписать приложение на использование нескольких серверов СУБД, но как быть, если таковых нет? Тут на помощь нам приходит mysql-proxy. Работая прозрачно для клиента, mysql-proxy умеет проксировать запросы нескольких slave & master серверов.

далее будет описание тестов
Читать дальше →

Кто стоит за соединениями?

Время на прочтение2 мин
Количество просмотров5.7K
Периодически возникают ситуации, когда хочется понять, какой же процесс на сервере повинен за конкретное соединение с СУБД. К примеру, очень много соединений к базе и хочется узнать, откуда они идут. Либо, есть какие-то «тяжёлые» соединения (по которым какие тяжёлые запросы идут, которые тормозят всё).

Можно ли это вообще узнать эту информацию? Оказалось, что в этом нет ничего сложного! Однако, каждый раз руками устанавливать соответствие довольно муторно. Так почему бы не автоматизировать процесс?

Нет ничего проще!
Читать дальше →

Масштабируемость реляционных БД

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

Q:


В Facebook используют MySQL зная, что он плохо масштабируется (или здесь какая-то особая магия?). Я хотел спросить, из каких соображений они выбрали MySQL? Используют ли JOIN'ы? И не планируют ли перейти на другую БД?


A:


Отвечает Adam D'Angelo, бывший CTO Facebook, сейчас он развивает свой стартап Quora:
  1. Если разбивать данные по разным серверам на уровне приложения, то масштабируемость MySQL не такая уж и большая проблема. На 2008 год, в Facebook [1] у нас было 1800 MySQL серверов для которых требовалось всего два администратора. Конечно, вы не сможете сделать JOIN с данными с разных серверов, но NoSQL-базы вам тоже этого не позволят. Нет никаких данных о том, что в Facebook используют Cassandr'у как основное хранилище, и, кажется, что единственное, для чего она там нужна — это поиск по входящим сообщениям. [2]

Читать дальше →

Что интересного нам расскажет EXPLAIN EXTENDED?

Время на прочтение6 мин
Количество просмотров13K
Большинство разработчиков на MySQL знакомы с командой EXPLAIN, однако значительно меньше людей знают о команде EXPLAIN EXTENDED, появившуюся ещё в MySQL 4.1, и ещё меньше умеют ею пользоваться.

EXPLAIN EXTENDED умеет показывать, что же конкретно делает с Вашим запросом оптимизатор MySQL. Для разработчика может быть совсем не очевидно, насколько сильно может отличаться написанный им запрос от того, который в действительности будет выполнен сервером. Этот процесс называется механизмом перезаписи запросов (query-rewrite), и он является частью любого хорошего SQL-оптимизатора. Команда EXPLAIN EXTENDED добавляет дополнительные предупреждения (warnings) к выводу команды EXPLAIN, в том числе и переписанный SQL-запрос.
Читать дальше →

MySQL prepared statement не переносит изменение таблицы

Время на прочтение1 мин
Количество просмотров1.3K
Upd: описанный ниже эффект проявляется только в MySQL ниже 5.1.25 — спасибо pharod.

Случайно обнаружился интересный эффект, приводивший к багу в приложении:
mysql> create table test(a int,b int);
Query OK, 0 rows affected (0.11 sec)

mysql> prepare ps from "select * from test";
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> alter table test drop column b;
Query OK, 0 rows affected (0.27 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> execute ps;
ERROR 1054 (42S22): Unknown column 'testdb.test.b' in 'field list'

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

В реальной жизни проблема обнаружилась так: класс, отвечающий за общение с базой, кэширует prepared statements. Закэшированные statements поломались, когда потребовалось во время выполнения менять схему базы (не спрашивайте, зачем потребовалось: не всё в жизни делается так, как нам хочется). Будьте осторожнее!

Монти не сдаётся

Время на прочтение1 мин
Количество просмотров843
Казалось бы, сделку Oracle и Sun уже одобрили все инстанции. Однако, один из основных разработчиков СУБД MySQL Монти Видениус никак не может смириться с тем, что его детище попало в плохие руки. На днях стало известно, что Монти подал апелляцию в Европейский суд, требуя аннулировать решение европейский властей, которые одобрили сделку.

Напомним, что антимонопольные органы одобрили сделку после того, как Oracle опубликовала декларацию из 10 пунктов, в которой обязалась поддерживать конкурентоспособность MySQL, производить улучшения в MySQL, сохранить доступность API для разработчиков и т.д.

В интервью Financial Times сам Монти Видениус сказал, что не хочет комментировать содержание апелляции, пока не дождётся официального ответа Oracle. Он только добавил, что декларация Oracle «не стоит той бумаги, на которой напечатана» и он хотел бы получить реальные гарантии.

Монти Видениус также сказал, что оплатил подачу апелляции из собственного кармана, но действует в интересах множества людей, подписавших онлайновую петицию в защиту MySQL.

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

Визуализация разработки MySQL 2000 — 2010

Время на прочтение1 мин
Количество просмотров1.1K
Наткнулся недавно на инструмент для визуализации gource. Стало интересно как же выглядит MySQL в этом свете.
Видео под катом.

Читать дальше →

Очередная встреча Moscow MySQL User Group пройдет 17мая в 19:30 м.ВДНХ

Время на прочтение1 мин
Количество просмотров571
imageЕсть идея провести очередную встречу Moscow MySQL User Group 17 мая(пн) в районе м.ВДНХ в 19:30 — неформальное общение и разговоры… MySQL и что ждет всех нас в
будующем :-)

Участие традиционно бесплатное.
Регистрация в топике
groups.google.ru/group/moscow-mysql-user-group/browse_thread/thread/4ce04ca2425d353

Указывайте полное ФИО, компанию, когда сможете придти… встреча до 22:00

Запись на встречу до 15мая 12:00

Ведущий встречи — Костя Осипов (Team Lead, Server Runtime, MySQL)

Гости встречи… надеюсь их не совсем замучают на DEVCONF 2010 ;-)

Michael Widenius Co-Founder of MySQL AB
Author of the MySQL Server and MariaDB fork
monty-says.blogspot.com

Сергей Петруня (http://s.petrunia.net/blog) работает в Monty Program
Ab и является одним из разработчиков MariaDB. Его предыдущее место
работы — MySQL Ab, где он работал над оптимизатором запросов и закодировал
такие оптимизации как index_merge, partition pruning другие.

Алик Рубин, MySQL, Норвегия
Готов обсуждать (MySQL replication,MySQL cluster, DRBD/HeartBeat/ MySQL, Shared Disk)

До встречи на MMUG!

MongoDB vs MySQL (vs Cassandra): А теперь чуть более правильный ответ

Время на прочтение3 мин
Количество просмотров27K
Собственно, сегодня был запощен топик "Сравниваем производительность MongoDB и MySQL на простом примере", в котором указывалось, что MongoDB превышает по производительности MySQL в разы. Хех, когда такое пишут — я сразу лезу проверять и сомневаться. Я полез в исходники оригинального теста (спасибо за публикацию). И как оказалось автор оригинального топика сделал ошибку в три символа и на самом деле не все так:
  1. В оригинале: MongoDB быстрее MySQL пишет в 1.5 раза (ДА, правда у меня в 3 раза)
  2. В оригинале: MongoDB быстрее MySQL читает в 10 раз (НЕТ, на самом деле — MongoDB примерно на равных плюс-минус 10-30%)
  3. InnoDB vs MyISAM — плюс-минус (в оригинале не тестировалось)
Сравнение здесь происходит только как key-value storage (запись-чтение по primary key).


На графике — число операций в секунду, (больше — лучше), шкала логарифмическая.
Последняя строка — то, что тестировал автор оригинального топика (неправильное, не в критику — все мы ошибаемся и учимся).


А теперь подробнее об ошибке…
Читать дальше →

Как FriendFeed использует MySQL для хранения данных без схемы

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

Условия


Мы используем MySQL для хранения любых данных FriendFeed. Наша база данных растёт вместе с числом пользователей. Сейчас у нас более 250 миллионов записей, это записи пользователей (post'ы), комментарии, оценки («likes»)

По мере того как росла база данных, мы время от времени имели дело с проблемами масштабируемости. Мы решали проблемы стандартными путями: slave-сервера, используемые только для чтения, memcache для увеличения пропускной способности чтения и секционирование для увеличения пропускной способности записи. Однако, по мере роста, использованные методы масштабируемости привели к затруднению добавлению новой функциональности.

В частности, изменение схемы базы данных или добавление индексов к существующим 10-20 миллионов записей приводили к полной блокировке сервера на несколько часов. Удаление старых индексов требовало времени, а не удаление ударяло по производительности, так как база данных продолжала использовать их на каждом INSERT. Существуют сложные процедуры с помощью которых можно обойти эти проблемы (например создание нового индекса на slave-сервере, и последующий обмен местами master'a и slave), однако эти процедуры настолько тяжелые и опасные, что они окончательно лишили нас желания добавлять что-то новое, требующее изменение схемы или индекса. А так как наши базы сильно распределены, реляционные вещи MySQL как например JOIN никогда не работали для нас. Тогда мы решили поискать решение проблем, лежащее вне реляционных баз данных.

Существует множество проектов, призванных решить проблему хранения данных с гибкой схемой и построением индексов на лету (например CouchDB). Однако, по-видимому ни один из них не используется крупными сайтами. В тестах о которых мы читали и прогоняли сами, ни один из проектов не показал себя стабильным, достаточно зрелым для наших целей (см. this somewhat outdated article on CouchDB, например). А все это время MySQL работал. Он не портил данные. Репликация работала. Мы уже в достаточной мере понимали все его узкие места. Нам нравился MySQL именно как хранилище, вне реляционных шаблонов.

Все взвесив, мы решили создать систему хранения данных без схемы поверх MySQL, вместо использования полностью нового решения. В этой статье я попытаюсь описать основные детали системы. Так же нам любопытно как другие сайты решили эти проблемы. Ну и мы думаем, что наша работа будет полезна другим разработчикам.
Читать дальше →

Задача на сортировку

Время на прочтение3 мин
Количество просмотров4.9K
Возможно, кому-то эта задача покажется пустяковой, но лично я потратил на неё несколько часов, израсходовав подсказки «мнение зала» и «звонок другу». Зачем я это решал? Ответ прост: мне действительно нужно было реализовать такой подход для моего небольшого сайтика Одио.ру. Если вкратце, то там публикуются записи с самых разных сайтов, стягиваемые по RSS. Сложность в том, что даты в этих записях могут полностью совпадать (даже в рамках одной ленты), при этом последовательность ID имеет смысл только в рамках одной ленты, но никак не влияет на весь поток записей. Итак, давайте перейдем к условиям задачи.

Читать дальше →

Исправление работы MySQL при поломке innoDB-таблиц

Время на прочтение3 мин
Количество просмотров59K
Здравствуйте!
mysql innodb
Я (быть может, как и вы) — разработчик сайтов, и мне, чтобы все мои наработки не потерялись нужен SVN. А так как я работаю не один, то еще, как минимум, и общая БД. Несколько лет назад мы приобрели NAS-сервер Synology DS-101 (Tom`s Guide или Nix), устроили там хранилище, включили базу (правда, MySQL4). Несколько лет служил он нам верой и правдой, пережил приход пьяных электриков (когда нас сначала подключили на 380В, а потом спохватились — почти все погорело), но вот… несколько недель назад база не хотела загружаться. Пришлось исправлять.

Все бы ничего, если бы этот случай не повторился…
Читать дальше →

Автоматическая сортировка строк с вспомогательным порядковым столбцом — средствами MySQL

Время на прочтение4 мин
Количество просмотров7.8K
sort
Недавно пришлось выполнить махинацию с БД которая, как кажется на первый взгляд, совершенно невыполнима средствами MySQL. Перед глазами у меня была таблица товаров, сортировка которых осуществляется вспомогательным столбцом `order_num` ('порядковый номер'): она позволяет задавать ручную сортировку товаров.
Но вот потребовалось автоматически заполнить этот столбец так, чтобы товары оказались отсортированы по названию: то есть, с рядом ограничений, изменить столбец `order_num` во всей таблице. Очень хотелось обойтись средствами MySQL без привлечения каких-либо дополнительных инструментов, и задача была решена :)

Сложность задачи также в том, что MySQL не умеет делать UPDATE таблицы и одновременно читать из неё: в MyISAM таблица эксклюзивно блокируется при записи и нет возможности произвести чтение в подзапросе.

Читать дальше →

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