Ответ 1
С тех пор, как вы поставили щедрость, я поделюсь своими секретами... [/p >
В общем, все SQL-запросы, которые я настроил сегодня, требуют использования подзапросов. Выйдя из мира баз данных Oracle, все, что я считал само собой разумеющимся, не менялось с MySQL. И мое чтение по настройке MySQL заставляет меня прийти к выводу, что MySQL стоит за Oracle с точки зрения оптимизации запросов.
В то время как простые запросы, требуемые для большинства приложений B2C, могут хорошо работать для MySQL, большая часть совокупного типа отчетов, необходимых для отчета Intelligence Reporting, по-видимому, требует справедливого планирования и повторной организации SQL-запросов для руководства MySQL для выполнения они быстрее.
Администрирование:
max_connections
- количество одновременных подключений. Значение по умолчанию - 100 соединений (151 с 5.0) - очень мало.
Примечание:
соединения занимают память, и ваша ОС не сможет обрабатывать множество подключений.
Бинарные файлы MySQL для Linux/x86 позволяют иметь до 4096 одновременных подключений, но само скомпилированные двоичные файлы часто имеют меньший предел.
Установите table_cache в соответствии с количеством открытых таблиц и одновременных подключений. Посмотрите на значение open_tables, и если он быстро растет, вам нужно будет увеличить его размер.
Примечание:
Для двух предыдущих параметров может потребоваться много открытых файлов. 20 + max_connections + table_cache * 2 - хорошая оценка того, что вам нужно. MySQL в Linux имеет параметр open_file_limit, установите этот предел.
Если у вас есть сложные запросы, то sort_buffer_size и tmp_table_size, вероятно, будут очень важны. Значения будут зависеть от сложности запросов и доступных ресурсов, но рекомендуется 4Mb и 32Mb, начиная с начальной точки.
Примечание. Это значения "для каждого соединения", среди read_buffer_size, read_rnd_buffer_size и некоторые другие, что означает, что это значение может потребоваться для каждого соединения. Поэтому при настройке этих параметров учитывайте свою нагрузку и доступный ресурс. Например sort_buffer_size выделяется только в том случае, если MySQL должен выполнить сортировку. Примечание: будьте осторожны, чтобы не хватить памяти.
Если у вас установлено много подключений (т.е. веб-сайт без постоянных подключений), вы можете повысить производительность, установив thread_cache_size в ненулевое значение. 16 - хорошее значение для начала. Увеличьте значение, пока ваши threads_created не будут расти очень быстро.
ПЕРВИЧНЫЙ КЛЮЧ:
В таблице может быть только один столбец AUTO_INCREMENT, он должен быть проиндексирован и не может иметь значение DEFAULT
KEY обычно является синонимом INDEX. Ключевой атрибут PRIMARY KEY также может быть указан как KEY, если задан в определении столбца. Это было реализовано для совместимости с другими системами баз данных.
ПЕРВИЧНЫЙ КЛЮЧ - уникальный индекс, где все ключевые столбцы должны быть определены как NOT NULL
Если индекс PRIMARY KEY или UNIQUE состоит только из одного столбца, который имеет целочисленный тип, вы также можете обратиться к столбцу как "_rowid" в операторах SELECT.
В MySQL имя PRIMARY KEY является PRIMARY
В настоящее время только таблицы InnoDB (v5.1?) поддерживают внешние ключи.
Обычно вы создаете все индексы, которые вам нужны при создании таблиц. Любой столбец, объявленный как PRIMARY KEY, KEY, UNIQUE или INDEX, будет проиндексирован.
NULL означает "не имеет значения". Чтобы проверить NULL, вы не можете использовать операторы арифметического сравнения, такие как =, <, или < > . Вместо этого используйте операторы IS NULL и NOT NULL:
NO_AUTO_VALUE_ON_ZERO подавляет автоматический приращение для 0, так что только NULL генерирует следующий порядковый номер. Этот режим может быть полезен, если 0 хранится в столбце AUTO_INCREMENT таблицы. (Кстати, сохранение 0 - это не рекомендуемая практика.)
Чтобы изменить значение счетчика AUTO_INCREMENT для новых строк:
ALTER TABLE mytable AUTO_INCREMENT = value;
или SET INSERT_ID = значение;
Если не указано иное, значение начинается с: 1000000 или указывается так:
...) ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1
Timestamps:
Значения для столбцов TIMESTAMP преобразуются из текущего часового пояса в UTC для хранения, и от UTC к текущему часовому поясу для извлечения.
http://dev.mysql.com/doc/refman/5.1/en/timestamp.html Для одного столбца TIMESTAMP в таблице вы можете назначить текущую временную метку как значение по умолчанию и значение автоматического обновления.
одно, что нужно учитывать при использовании одного из этих типов в предложении WHERE, лучше всего сделать WHERE datecolumn = FROM_UNIXTIME (1057941242) и не WHERE UNIX_TIMESTAMP (datecolumn) = 1057941242. выполнение последнего не будет использовать индекс в этом столбце.
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
UNIX_TIMESTAMP()
FROM_UNIXTIME()
UTC_DATE()
UTC_TIME()
UTC_TIMESTAMP()
если вы конвертируете дату и время в unix timestamp в MySQL:
А затем добавьте к нему 24 часа:
И затем преобразуйте его обратно в день, когда он волшебным образом теряет час!
Вот что происходит. При преобразовании временной отметки unix в дату и время учитывается часовой пояс, и только так случилось, что между 28 и 29 октября 2006 года мы ушли с летнего времени и потеряли час.
Начиная с MySQL 4.1.3 функции CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE() и FROM_UNIXTIME() возвращают значения в текущий часовой пояс соединения, который доступен как значение системной переменной time_zone. Кроме того, UNIX_TIMESTAMP() предполагает, что его аргумент является значением даты и времени в текущем часовом поясе.
Текущий часовой пояс не влияет на значения, отображаемые такими функциями, как UTC_TIMESTAMP() или значения в столбцах DATE, TIME или DATETIME.
ПРИМЕЧАНИЕ. ON UPDATE ONLY обновляет DateTime, если поле было изменено. Если UPDATE не приводит к изменению полей, значение DateTime не обновляется!
Кроме того, первый TIMESTAMP всегда AUTOUPDATE по умолчанию, даже если не указан
При работе с датами я почти всегда провожу Julian Date, потому что Data math - это просто вопрос добавления или вычитания целых чисел, а также Seconds from Midnight по той же причине. Редко мне нужно время для восстановления более тонкой детализации, чем секунды.
Оба они могут быть сохранены как целое число в 4 байта, и если пространство действительно жестко, можно объединить в UNIX-время (секунды с эпохи 1/1/1970) как целое число без знака, которое будет хорошим до примерно 2106:
'secs в 24Hrs = 86400
'Подпись Integer max val = 2,147,483,647 - может содержать 68 лет секунд
'Unsigned Integer max val = 4 294 967 295 - может содержать 136 лет секунд
Двоичный протокол:
В MySQL 4.1 был введен двоичный протокол, который позволяет отправлять нестрочные значения данных и возвращается в собственном формате без преобразования в и из строкового формата. (Очень полезно)
Кроме того, mysql_real_query() быстрее, чем mysql_query(), потому что он не вызывает strlen() для работы с строкой оператора.
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html Бинарный протокол поддерживает подготовленные на стороне сервера операторы и позволяет передавать значения данных в собственном формате. Бинарный протокол подвергся довольно незначительной ревизии во время предыдущих выпусков MySQL 4.1.
Вы можете использовать макрос IS_NUM(), чтобы проверить, имеет ли поле числовой тип. Передайте значение типа в значение IS_NUM(), и оно будет иметь значение TRUE, если поле является числовым:
Следует отметить, что двоичные данные могут быть отправлены внутри обычного запроса, если вы избегаете его и помните, что MySQL требует только того, что обратная косая черта и символ кавычки будут экранированы. Таким образом, это действительно простой способ для INSERT более коротких двоичных строк, таких как зашифрованные/соленые пароли, например.
Главный сервер:
http://www.experts-exchange.com/Database/MySQL/Q_22967482.html
http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2
ПОДАВЛЕНИЕ ГРАНТА. to slave_user ИДЕНТИФИЦИРОВАН ПО "slave_password"
#Master Binary Logging Config STATEMENT causes replication
to be statement-based - default
log-bin=Mike
binlog-format=STATEMENT
server-id=1
max_binlog_size = 10M
expire_logs_days = 120
#Slave Config
master-host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2
Файл двоичного журнала должен читать:
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/
http://dev.mysql.com/doc/refman/5.1/en/mysqlbinlog.html
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://dev.mysql.com/doc/refman/5.1/en/binary-log-setting.html
Вы можете удалить все файлы двоичного журнала с помощью оператора RESET MASTER или подмножества из них с помощью PURGE MASTER
- result-file = binlog.txt TrustedFriend-bin.000030
Нормализация:
http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html
Функции UDF
http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx
http://souptonuts.sourceforge.net/readme_mysql.htm
Datatypes:
http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2
http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/
Следует отметить, что в смешанной таблице с CHAR и VARCHAR mySQL изменит CHAR на VARCHAR
RecNum integer_type UNSIGNED NOT NULL AUTO_INCREMENT, ПЕРВИЧНЫЙ КЛЮЧ (RecNum)
MySQL всегда представляет даты с первым годом, в соответствии со стандартными спецификациями SQL и ISO 8601.
Разное:
Извлечение некоторых функций MySQl приведет к уменьшению файлов данных и более быстрый доступ. Например:
- datadir укажет каталог данных и
- skip-innodb отключит опцию inno и сохранит вас 10-20M
Подробнее здесь http://dev.mysql.com/tech-resources/articles/mysql-c-api.html
Скачать главу 7 - бесплатно
InnoDB является транзакционным, но есть накладные расходы, связанные с производительностью. Я нашел таблицы MyISAM достаточными для 90% моих проектов. Таблицы с безопасными транзакциями (MyISAM) обладают рядом преимуществ, все из которых происходят из-за того, что:
нет накладных расходов на транзакцию:
Гораздо быстрее
Более низкие требования к дисковому пространству
Меньшая память, необходимая для выполнения обновлений
Каждая таблица MyISAM хранится на диске в трех файлах. Файлы имеют имена, которые начинаются с имени таблицы и имеют расширение для указания типа файла. Файл .frm сохраняет формат таблицы. Файл данных имеет расширение .MYD(MYData). Файл индекса имеет расширение .MYI(MYIndex).
Эти файлы могут быть скопированы в хранилище без изменений, не используя функцию резервного копирования MySQL Administrators, которая требует много времени (так же как и восстановление)
Трюк состоит из копии этих файлов, затем DROP table. Когда вы помещаете файлы обратно MySQl распознает их и обновит отслеживание таблиц.
Если вы должны выполнить резервное копирование/восстановление,
Восстановление резервной копии или импорт из существующего файла дампа может занять много времени в зависимости от количества индексов и первичных ключей, которые у вас есть в каждой таблице. Вы можете значительно ускорить этот процесс, изменив исходный файл дампа, окружив его следующим:
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
.. your dump file ..
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
Чтобы значительно увеличить скорость перезагрузки, добавьте команду SQL SET AUTOCOMMIT = 0; в начале файла дампа и добавьте COMMIT; до конца.
По умолчанию автокоммит включен, что означает, что каждая команда вставки в файл дампа будет рассматриваться как отдельная транзакция и записан на диск до того, как будет запущен следующий. Если вы не добавите эти команды, перезагрузка большой базы данных в InnoDB может занять много часов...
Максимальный размер строки в таблице MySQL составляет 65 535 байт.
Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и on = максимальный размер строки (65 535 байт)
Значения VARCHAR не заполняются при их сохранении. Промежуточные пробелы сохраняются, когда значения сохраняются и извлекаются в соответствии со стандартным SQL.
CHAR и значения VARCHAR в MySQL сравниваются без учета конечных пробелов.
Использование CHAR только ускорит ваш доступ, если вся запись фиксированного размера. То есть, если вы используете какой-либо объект с переменными размерами, вы можете также сделать их все переменными. Вы не получаете скорость, используя CHAR в таблице, которая также содержит VARCHAR.
Предел VARCHAR из 255 символов был увеличен до 65535 символов с MySQL 5.0.3
Полнотекстовые поисковые запросы поддерживаются только для таблиц MyISAM.
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Столбцы BLOB не имеют набора символов, а сортировка и сравнение основаны на числовые значения байтов в значениях столбцов
Если строгий режим SQL не включен и вы назначаете значение столбцу BLOB или TEXT, превышает максимальную длину столбца, значение усекается, чтобы соответствовать, и генерируется предупреждение.
Полезные команды:
проверить строгий режим: SELECT @@global.sql_mode;
отключить строгий режим:
SET @@global.sql_mode = '';
SET @@global.sql_mode = 'MYSQL40'
или удалить: SQL-режим = "STRICT_TRANS_TABLES,...
ПОКАЖИТЕ КОЛОНКИ ОТ mytable
SELECT max (namecount) AS virtualcolumn
FROM mytable ORDER BY virtualcolumn
http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id last_insert_id()
получает PK последней строки, вставленной в текущий поток max (pkcolname), получает последний PK в целом.
Примечание: если таблица пуста max (pkcolname) возвращает 1 mysql_insert_id() преобразует возвращаемый тип собственной функции API MySQL C mysql_insert_id() в тип long (с именем int в PHP).
Если ваш столбец AUTO_INCREMENT имеет тип столбца BIGINT, значение, возвращаемое mysql_insert_id() будет некорректным. Вместо этого в SQL-запросе используйте внутреннюю функцию MySQL SQL LAST_INSERT_ID().
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Просто обратите внимание, что когда вы пытаетесь вставить данные в таблицу и получите ошибку:
Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’
используя что-то вроде
INSERT INTO table (this, that) VALUES ($this, $that)
потому что у вас нет апострофов вокруг значений, которые вы пытаетесь вставить в таблицу. Поэтому вы должны изменить свой код на:
INSERT INTO table (this, that) VALUES ('$this', '$that')
напоминание, что `` используются для определения полей, баз данных или таблиц MySQL, а не значений;)
Потерянное соединение с сервером во время запроса:
http://dev.mysql.com/doc/refman/5.1/en/gone-away.html
http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html
http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html
http://dev.mysql.com/doc/refman/5.1/en/show-variables.html
http://dev.mysql.com/doc/refman/5.1/en/option-files.html
http://dev.mysql.com/doc/refman/5.1/en/error-log.html
Запросы настройки
http://www.artfulsoftware.com/infotree/queries.php?&bw=1313
Ну, этого должно быть достаточно, чтобы заработать бонус, который я бы подумал... Плоды многих часов и многих проектов с большой бесплатной базой данных. Я разрабатываю серверы данных приложений на платформах Windows, в основном с MySQL. Худший беспорядок, который я должен был выправить, был
Конечный кошмар базы данных устаревшего MySQL
Это потребовало серии приложений для обработки таблиц во что-то полезное, используя многие из трюков, упомянутых здесь.
Если вы нашли это удивительно полезным, выразить свою благодарность, проголосовав за него.
Также ознакомьтесь с моими другими статьями и документами по адресу: www.coastrd.com