давний пользователь Oracle переключается на MySQL, есть ли какие-либо ошибки, чтобы быть в курсе? - PullRequest
3 голосов
/ 20 июля 2010

Случилось так, что все проекты за последние 10 лет были с Oracle в качестве сервера базы данных.Теперь я сам начинаю сторонний проект с MySQL (последняя стабильная версия).

Есть ли какие-то ошибки (вещи, которые не работают так, как ожидал пользователь Oracle)?Все, что связано с управлением транзакциями, блокировками, уровнями изоляции, индексами и тому подобным.

Я в основном разработчик Java, поэтому мне интересно, как база данных просматривается с сервера приложений.Хранимые процедуры, (сложные) представления или какие-либо необычные вещи не в моем радаре для этого проекта.

Спасибо.

Ответы [ 3 ]

11 голосов
/ 20 июля 2010

MySQL имеет различные движки, основными из которых являются INNODB и MyISAM. MyISAM не поддерживает транзакции и ограничения внешнего ключа .Уровни изоляции схожи - в наши дни они кажутся относительно стандартными для баз данных.

Индексы

Индексы разные - MySQL имеет кластерные и некластеризованные индексы.Кластерные индексы обычно предназначены для первичного ключа, но не обязательно.Существует также ограничение на пространство для определения индексов - 767 для INNODB, 1000 для MyISAM .Поддерживающие индексы поддерживаются, не поддерживаются индексы на основе функций ...

Оптимизатор может использовать только один индекс на предложение SELECT - проверьте вывод EXPLAIN PLAN.Существует синтаксис для указания индекса, который будет использоваться, но это подсказка, и он все еще может игнорироваться оптимизатором.

Ограничения

MySQL имеет синтаксис ограничения CHECK, но никакой движок не применяет принудительноэто в настоящее время .Единственный вариант - использовать триггеры.Уникальные ограничения реализованы в MySQL как индексы.

Пользовательская обработка ошибок

Вам необходимо объявить обработчики для пользовательской обработки ошибок: http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

Ранее -
MySQL не делаетУ нас нет никакой поддержки для определения пользовательских ошибок, чтобы различать, скажем, целостность данных и ошибки бизнес-правил.

Аналитика / Ранжирование / WIndowing функциональность

MySQL не имеет таких функций - нет ROW_NUMBER, NTILE, RANK или DENSE_RANK.Вы можете создать функциональность psuedo, используя переменные - есть множество примеров на SO, если вы отметите теги «mysql», «rank».

Синтаксис WITH - Факторинг подзапроса

Это Другое дело, что MySQL не имеет .

Поддержка иерархических запросов

Как вы уже догадались - Нет рекурсивной поддержки иерархических запросов.Oracle имеет CONNECT BY начиная с версии v2 (!!), но стандарт ANSI заключается в использовании предложения WITH, как вы видите в SQL Server 2005 +.

Views

MySQL не поддерживает материализованные представления,поддержка представления ограничена - нельзя использовать подзапросы, например, .

PIVOT / UNPIVOT

Это стандартный синтаксис ANSI;Oracle начала поддержку в 11g, но MySQL снова не поддерживает это.Единственная опция - выражения CASE и агрегатные функции, которые остаются наиболее переносимым средством реализации этой функции (SQL Server 2005+ поддерживает PIVOT / UNPIVOT).

Sequence

MySQL не поддерживает последовательности,и самым близким является определение столбца INT как auto_increment.Это делает невероятно трудным использование одной и той же последовательности значений в двух или более таблицах (не то, что вам действительно нужно, если не нужно)Кроме того, только один столбец auto_increment может быть определен для каждой таблицы.Приращение и смещение в масштабе экземпляра - измените его, и вы включите каждый столбец auto_increment в каждой базе данных, которую обслуживает экземпляр.Сброс значения auto_increment требует привилегии ALTER TABLE;удаление / усечение данных не изменит текущего значения.

На этом замечании MySQL не поддерживает предложение RETURNING. Вам нужно использовать LAST_INSERT_ID(), чтобы получить значение auto_increment для вновь созданной строки .

Типы данных

MySQL не имеет типа данных NUMBER - он разбивает числа на INT, MEDIUMINT и т. д. .В этом отношении MySQL очень похож на SQL Server. Тип данных MySQL TEXT (TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT) более приспособлен, чем ограничение 4000 в Oracle VARCHAR2.MySQL поддерживает CLOB и BLOB ...

Пакеты, хранимые процедуры, функции

MySQL поддерживает пользовательские функции и хранимые процедуры - мне еще не приходилось сталкиваться с базой данных, которая поддерживает нечто подобное пакетам Oracle.SQL Server имеет сборки CLR, но для этого требуется использовать код .NET CLR, а не собственный TSQL / PLSQL.

2 голосов
/ 20 июля 2010

MySQL - одна из моих любимых БД.Я использовал его в течение многих лет с отличными результатами.Вскоре после большого усилия по настройке Oracle у меня появилось несколько хороших мыслей.

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

Кэш запросов по большей части был глобальным.Это вызывает состояние глобальной блокировки, когда кеш включен.

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

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

Кроме того, следите за чувствительностью к регистру.Иногда это там, в основном это не так.Это может запутать.

0 голосов
/ 20 июля 2010

С текущим MySQL - Basic SQL будет точно таким же, но MySQL не очень хорошо обрабатывает большие таблицы / базы данных. ~ 10 миллионов записей на MyISAM на сервере среднего класса Intel Xeon, начинают появляться ошибки данных.

Но, поскольку Oracle приобрела MySQL, эти различия могут со временем исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...