Устранение следующих из выявленных проблем относится к числу первоочередных задач:
-
ANALYZE TABLEна таблицахBDBв некоторых случаях может сделать таблицу недоступной для использования, пока не произойдет перезапускmysqld. При этом в файле ошибок MySQL можно будет увидеть ошибки, подобные следующим:001207 22:07:56 bdb: log_flush: LSN past current end-of-log
Не следует выполнять
ALTER TABLEна таблицахBDB, на которых осуществляются многокомандные транзакции, пока все эти транзакции не завершатся (возможно, данные транзакции будут проигнорированы).ANALYZE TABLE,OPTIMIZE TABLEиREPAIR TABLEмогут вызвать проблемы на таблицах, для которых используетсяINSERT DELAYED.Выполнение
LOCK TABLE ...иFLUSH TABLES ...не гарантирует, что на данной таблице нет исполняемых в текущий момент незаконченных транзакций.Открытие таблиц
BDBпроисходит несколько медленно. Если база данных содержит много таблицBDB, то потребуется значительное время для использования клиентаmysqlна этой базе данных, если не применять опцию-Aили если использоватьrehash. Это особенно заметно при наличии большого табличного кэша.
Следующие проблемы также известны и будут устранены в свое время:
-
При использовании функции
RPAD, или любой другой строковой функции, добавляющией пробелы в правую часть строки, в запросе, для которого MySQL будет создавать временные таблицы для его выполнения, все результирующие строки будут в результате обработаны RTRIM'ом (RTRIM'ed). Вот пример запроса:SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, ' ') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY t2.record;В результате невозможно получить пробелы в правой части результирующего столбца.
Такое поведение присутствует во всех версиях MySQL.
Причина заключается в том, что HEAP-таблицы, которые в первую очередь используются для временных таблиц, неспособны работать с VARCHAR-столбцами.
Такое поведение будет исправлено в одной из версий 4.1.
При использовании
SET CHARACTER SETнельзя использовать преобразованные символы в именах базы данных, таблицы и столбца.Нельзя использовать
_или%сESCAPEвLIKE ... ESCAPE.Если в столбце
DECIMALчисло хранится в различных форматах (+01.00, 1.00, 01.00), тоGROUP BYможет рассматривать каждую величину как самостоятельную.DELETE FROM merge_tableпри использовании безWHEREбудет очищать только отображение для этой таблицы, а не удалять все данные в отображенных таблицах.При использовании потоков MIT-pthreads нельзя расположить сервер в ином каталоге. Поскольку для решения данной проблемы требуются изменения для потоков MIT-pthreads, маловероятно, что мы ее устраним (see Раздел 2.3.6, «Замечания по потокам MIT-pthreads»).
Не обеспечивается ``надежное'' применение величин
BLOBвGROUP BYилиORDER BYилиDISTINCT. В этих случаях при сравнении величинBLOBиспользуются только первыеmax_sort_lengthбайтов (по умолчанию 1024). Это можно изменить с помощью опции-O max_sort_lengthдляmysqld. Обходной путь для большинства случаев заключается в использовании подстроки:SELECT DISTINCT LEFT(blob,2048) FROM tbl_name.В сервере MySQL вычисления производятся в форматах типов
BIGINTилиDOUBLE(оба типа обычно имеют длину 64 бита). Это зависит от того, какую точность обеспечивает применяемая функция. Общее правило состоит в том, что битовые функции работают с точностьюBIGINT, функцииIFиELT()- с точностьюBIGINTилиDOUBLE, а остальные - с точностьюDOUBLE. Следует избегать применения беззнаковых величин двойной точности, если они могут превысить 63 бита (9223372036854775807), для каких-либо величин, кроме битовых полей! В версии сервера MySQL 4.0 реализована лучшая обработкаBIGINT, чем в 3.23.Во всех строковых столбцах, исключая
BLOBиTEXTпри извлечении данных автоматически удаляются все концевые пробелы. Для типовCHARэто хорошо и может рассматриваться как свойство, соответствующее ANSI SQL92. Ошибка заключается в том, что в сервере MySQL столбцыVARCHARтрактуются тем же самым образом.В одной таблице может быть только до 255 столбцов типа
ENUMиSET.В
MIN(),MAX()и других групповых функциях, MySQL сейчас сравниваетENUMиSET-столбцы по их строковому значению, а не по относительной позиции строки в множестве.При указании параметра
safe_mysqldвсе сообщения изmysqldнаправляются в журнал данного потокаmysqld. Одна из проблем заключается в том, что если вы исполняетеmysqladmin refreshдля того, чтобы закрыть и заново открыть журнал, тоstdoutиstderrбудут все еще по-прежнему направлены в старый журнал. При активном использовании--logследует отредактироватьsafe_mysqld, чтобы записи велись в`hostname`.err, а не в`hostname`.log, с тем, чтобы вы могли очищать пространство, удаляя старые журналы и вызываяmysqladmin refresh.-
При выполнении команды
UPDATEстолбцы обновляются слева направо. При ссылке на обновленный столбец вместо исходной величины будет получена обновленная величина. Например:mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
Эта команда обновит
KEYсо значением 2 вместо значения 1. -
В одном и том же запросе нельзя использовать временные таблицы более чем один раз. Например, следующая команда выполнена не будет:
mysql> SELECT * FROM temporary_table, temporary_table AS t2;
RENAMEне работает с временными таблицами или при использовании таблицыMERGE.-
Оптимизатор может обрабатывать
DISTINCTпо-разному, в зависимости от того, используются или нет в объединении ``скрытые'' столбцы. В объединении скрытые столбцы считаются частью результата (даже если они не показываются), в то время как в обычных запросах скрытые столбцы не участвуют в сравненииDISTINCT. Возможно, в будущем мы изменим это правило таким образом, чтобы при выполненииDISTINCTскрытые столбцы никогда не сравнивались. Например:SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;и
SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;Во втором случае в версии сервера MySQL 3.23.x можно получить две идентичных строки в результирующем наборе данных (поскольку скрытый столбец
idможет варьироваться). Заметьте, что это случается только с запросами, где в результате отсутствуют столбцыORDER BY, что не разрешается делать в ANSI SQL. -
Поскольку сервер MySQL обеспечивает возможность работать с типами таблиц, которые не поддерживают транзакции и, следовательно, не допускают отката данных, то поведение сервера MySQL в некоторых аспектах отличается от других серверов SQL. Это делается, чтобы гарантировать, что сервер MySQL никогда не будет нуждаться в откате SQL-команд. Такое поведение временами может быть несколько неудобным, так как вследствие этого величины столбцов должны проверяться в приложении. Однако благодаря такому решению вы получаете действительно хорошее увеличение скорости, поскольку для сервера MySQL обеспечивается возможность производить определенные оптимизации, что в противном случае было бы очень трудно сделать. При попытке установить столбец в некорректную величину сервер MySQL вместо выполнения отката будет сохранять в данном столбце ``наиболее вероятную величину'':
При попытке сохранить в числовом столбце величину, выходящую за допустимые пределы, сервер MySQL вместо нее будет сохранять в этом столбце наименьшую или наибольшую допустимую величину.
При попытке сохранить в числовом столбце строку, которая начинается не с числа, сервер MySQL будет сохранять в нем 0.
При попытке сохранить
NULLв числовом столбце, который не принимает значения величиныNULL, сервер MySQL вместоNULLбудет сохранять 0 или''(пустая строка) (однако это поведение можно изменить с помощью опции компиляции-DDONT_USE_DEFAULT_FIELDS).MySQL обеспечивает возможность сохранять некоторые ошибочные величины даты в столбцах
DATEиDATETIME(такие как 2000-02-31 или 2000-02-00). Идея заключается в том, что задача проверки валидности даты не входит в круг обязанностей сервера баз данных. Если MySQL может сохранить и корректно воспроизвести какие-либо значение даты, пусть и неправильное - MySQL будет сохранять такое значение. Если дата полностью неправильна, сервер MySQL будет сохранять в этом столбце специальную величину даты 0000-00-00.Если устанавливать столбец
ENUMв неподдерживаемую величину, то он будет устанавливаться в значение ошибкиempty stringс числовым значением 0.Если устанавливать столбец
SETв неподдерживаемую величину, то эта величина будет игнорироваться.
При выполнении
PROCEDUREна запросе, возвращающем пустой набор, в некоторых случаяхPROCEDUREне будет преобразовывать столбцы.При создании таблицы типа
MERGEне происходит проверки, если лежащие в ее основе таблицы имеют совместимые типы.Сервер MySQL пока еще не может обрабатывать величины
NaN,-InfиInfс двойной точностью. Их использование вызовет проблемы при попытке экспорта или импорта данных. В качестве промежуточного решения мы должны изменитьNaNнаNULL(если возможно) и-InfиInfна минимальную или, соответственно, максимально возможную величину двойной точности.LIMITна отрицательных числах трактуются как большие положительные числа.Если
ALTER TABLEиспользуется для того, чтобы сначала добавить индексUNIQUEк таблице, которая входит в таблицуMERGE, а затем - чтобы добавить обычный индекс к таблицеMERGE, то в случае, если существовал старый ключ, который не был уникальным в данной таблице, порядок ключей для таблиц будет различным. Это обусловлено тем, чтоALTER TABLEпомещает уникальные ключи перед обычными ключами, чтобы обеспечить возможность определять дублирующиеся ключи как можно раньше.
В более ранних версиях MySQL известны следующие ошибки:
Можно получить зависший поток при выполнении
DROP TABLEна таблице, которая является одной из числа многих таблиц, заблокированных с помощьюLOCK TABLES.-
В следующем случае может произойти аварийное завершение процесса:
Обработчик задержанных вставок имеет незаконченные вставки в таблицу.
LOCK tableс помощьюWRITE.FLUSH TABLES.
-
В версиях сервера MySQL до 3.23.2 команда
UPDATE, которая обновляла ключ с помощьюWHEREна тот же самый ключ, может оказаться неудачной, поскольку данный ключ использовался для поиска записей и одна и та же строка может быть найдена много раз:UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;
Обходным решением является использование:
mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;
Эта команда будет работать, поскольку сервер MySQL не будет использовать индекс на выражениях в утверждении
WHERE. До версии сервера MySQL 3.23 все числовые типы трактовались как поля с фиксированной точкой. Это означает, что необходимо было указывать, сколько десятичных знаков должно содержать поле с плавающей точкой. Все результаты возвращались с правильным количеством десятичных знаков.
В отношении ошибок, связанных со спецификой различных платформ, см. разделы о компилировании и переносе.