SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 22/01/2014, 05:44 PM   #1
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,419
Reputation: 104
Exclamation MySQL (F.A.Q.)

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

MySQL, мощное средство для хранения и получения большого количества данных. Заметьте не обработки, а именно хранения и получения! Да, на нем можно обрабатывать данные, но пользоваться этим нужно только для получения набора данных из имеющихся.
Если вы надеетесь что MySQL решит все ваши проблемы со скоростью обращения, записи или чтения данных, не обольщайтесь, для получения максимальной производительности не достаточно перенести ваши файлы в базу, далее БД, нужно ещё и правильно спроектировать эту БД. Данная тема поможет вам избежать частых ошибок на начальном этапе перехода на MySQL.

Итак поехали:

Кодировка таблиц

utf8_general_ci - должно отскакивать от зубов, ни какая другая. Мультибайтовая кодировка используемая в UNIX подобных системах. Позволяет избегать проблем с хранением специализированных символов и любого языка.

Советы:
  • Необязательно указывать кодировку для каждого поля, достаточно выбрать её по умолчанию при создании БД. Она сама будет присваиваться для всех строковых полей и таблиц.

Имена таблиц и столбцов

Общее:
  • Называйте все полными именами.
  • Не используйте префиксы типа p..., h..., b....
  • Не используйте разный регистр букв.
  • Используйте цифры только в крайнем случае.
  • Для разделения слов используйте "_" (землю).
  • Избегайте зарезервированных/системных слов, всегда можно найти слово синоним!

Таблицы:
Называйте таблицы в единственном числе, английскими названиями, например house, player, place. Это упростит понимание того что это за таблица и сделает работу с ней более интуитивной. И упростит интеграцию с сайтом в будущем, если планируется.

Ключи

Общее:
  • Не пренебрегайте созданием ключей, это основное средство которое ускорит работу вашей БД.
  • Если это записи данных у них всегда должен быть уникальный ключ - идентификатор! По нему должны производится обновления данных. Обычно это просто INT поле с ключём AUTO_INCREMENT. Ни когда не пытайтесь исправлять или перезаписывать данное поле самостоятельно, это должна делать только ваша БД без вашего участия.
  • Чем больше ключей в вашей таблице, тем быстрее вы будете получать данные. Это не значит что нужно создавать ключи по каждому полю. При подобном подходе вы получите только разрастающийся файл индексов, но не получите прироста скорости.

Как же создавать ключи:
Все просто, с умом. Например все мы знаем что в SA-MP не могут играть два человека с одинаковыми именами, при чем регистр не учитывается, поэтому для поля с никами игроков вы всегда смело можете создавать уникальный ключ. Для остальных ключей нужно просто посмотреть по каким критериям происходит выборка данных: например дома мы часто получаем по полю владельца, значит навесив на это поле ключ мы сможем быстро находить пустые дома, или мы можем указать у домов город в котором он находится, тогда ключ по этому полю позволит с легкостью находить дома в конкретном городе.
Так же не забывайте что в ключах можно комбинировать несколько полей. Но помните, что чем больше вариантов скомбинированных данных, тем быстрее будет разрастаться таблица индексов.

Дата и время

Общее:
  • Никогда не используйте для записи в БД или сравнения функции NOW(), UNIX_TIMESTAMP() или им подобные! Время на сервере может не соответствовать времени БД. Всегда используйте время на сервере.
  • Заранее определитесь в каком формате вам проще хранить дату и время.
  • БД дает мощнейшие средства для конвертирования даты и времени в любой формат, не пренебрегайте ими.

P.S. Если вас интересует что-то ещё или есть что дополнить, пишите в комментариях, дополню информацию.
__________________________________________________ _________________________________

F.A.Q.

Last edited by Stepashka; 02/06/2015 at 10:38 AM.
Stepashka is online now   Reply With Quote
Old 22/01/2014, 05:45 PM   #2
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,419
Reputation: 104
Default Re: MySQL (F.A.Q.)

Code:
 SET NAMES cp1251;
 SET SESSION character_set_server='utf8';
Не забываем что всеми любимый phpmyadmin по умолчанию работает не на utf8, не забываем его перенастроить.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 22/01/2014, 06:31 PM   #3
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,419
Reputation: 104
Default Что такое лэйблы и как использовать as.

Иногда происходит необходимость произвести сложный запрос, с обращением в две или более таблиц, или упростить имя столбца в результирующих данных, как же быть?!
Для этого в SQL есть лэйблы, призванные упростить понимание написанного.
На примерах это будет более очевидно:
Code:
SELECT
	players.username, house.pos_x, house.pos_y, house.pos_z
FROM
	players, house
WHERE
	players.banned = 0
	AND house.owner = players.username
Согласитесь выглядит это ужасно, давайте применим к таблицам лэйблы:
Code:
SELECT
	p.username, h.pos_x, h.pos_y, h.pos_z
FROM
--	players as p, house as h
	players p, house h
WHERE
	p.banned = 0
	AND h.owner = p.username
Стало гораздо приятней.
Обращаю ваше внимание на вариант с написанием as, данное слово дословно обозначает "называть как", т.е. в нашем примере таблицу players называть как p. В 5 версии MySQL данным словом можно пренебрегать, что и было сделано.
Выполнив данный запрос мы обнаружим что наши столбцы называются так как мы написали:
Code:
p.username, h.pos_x, h.pos_y, h.pos_z
Улучшим и это:
Code:
SELECT
	p.username as username,
	h.pos_x as x,
	h.pos_y as y,
	h.pos_z as z
FROM
	players p, house h
WHERE
	p.banned = 0
	AND h.owner = p.username
Теперь в результате мы получим столбцы с именами:
Code:
username, x, y, z
В данном случае пренебрегать словом as нельзя.

Также по лэйблам, тем что переназначают имена столбцов, можно производить сортировку, группировку и поствыборку.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 23/01/2014, 06:20 AM   #4
hub4
Big Clucker
 
Join Date: Jan 2009
Location: Russia
Posts: 106
Reputation: 19
Default Re: MySQL (F.A.Q.)

до лейблов все тоже вполне неплохо читалось) имхо только уменьшение длины.
ты лучше другое обьясни. разве для многотабличных запросов не JOIN надо пользовать?
каким образом в твоем первом примере сервер определяет по каким параметрам в какой таблице искать?
hub4 is offline   Reply With Quote
Old 23/01/2014, 06:52 AM   #5
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,419
Reputation: 104
Default Re: MySQL (F.A.Q.)

Quote:
Originally Posted by hub4 View Post
до лейблов все тоже вполне неплохо читалось) имхо только уменьшение длины.
ты лучше другое обьясни. разве для многотабличных запросов не JOIN надо пользовать?
каким образом в твоем первом примере сервер определяет по каким параметрам в какой таблице искать?
А ты умеешь правильно пользоваться JOIN? Лучше их избегать.
По сути это проблема MySQL, а вообще FROM не указывает что выборка должна производится из этих таблиц, оно указывает какие таблицы будут использоваться в запросе, а вот WHERE уже формирует запрос и по его условиям сервер производит выборку, в данном случае он сперва выберет пользователей, а потом для каждого пользователя сделает подзапрос во вторую таблицу и сопоставит данные.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 23/01/2014, 12:15 PM   #6
Urukhay
Gangsta
 
Join Date: Sep 2013
Posts: 636
Reputation: 2
Default Re: MySQL (F.A.Q.)

Хотелось бы более конкретного описания с примерами создание ключей.
Urukhay is offline   Reply With Quote
Old 27/01/2014, 10:36 AM   #7
Nazarik
Little Clucker
 
Nazarik's Avatar
 
Join Date: May 2013
Location: Ukraine / Lvov
Posts: 21
Reputation: 0
Default Re: MySQL (F.A.Q.)

Как лучше всего хранить данные, например для лицензии. (a,b,c,d)
В 1 поле ? "0|0|0|0"
или под каждую лицензию свое поле ?
Nazarik is offline   Reply With Quote
Old 27/01/2014, 11:04 AM   #8
Splav
Big Clucker
 
Join Date: Jan 2011
Posts: 125
Reputation: 2
Default Re: MySQL (F.A.Q.)

Quote:
Originally Posted by Nazarik View Post
Как лучше всего хранить данные, например для лицензии. (a,b,c,d)
В 1 поле ? "0|0|0|0"
или под каждую лицензию свое поле ?
Как удобнее тебе
Splav is offline   Reply With Quote
Old 27/01/2014, 11:36 AM   #9
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,419
Reputation: 104
Default Re: MySQL (F.A.Q.)

Quote:
Originally Posted by Nazarik View Post
Как лучше всего хранить данные, например для лицензии. (a,b,c,d)
В 1 поле ? "0|0|0|0"
или под каждую лицензию свое поле ?
Зависит от того где это будет использоваться, если только на сервере, то выше ответили. Если ещё и на сайте, а тем более в какой-то CMS, то отдельное поле.
Не встречал ни одной CMS которая могла бы, по умолчанию, работать с бинарными полями. Да и наглядней это.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 27/01/2014, 01:14 PM   #10
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,523
Reputation: 219
Default Re: MySQL (F.A.Q.)

Quote:
Originally Posted by Nazarik View Post
Как лучше всего хранить данные, например для лицензии. (a,b,c,d)
В 1 поле ? "0|0|0|0"
или под каждую лицензию свое поле ?
Есть нормальная форма, лучше придерживаться её: http://ru.wikipedia.org/wiki/Нормальная_форма
ZiGGi is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[GameMode] Basic MySQL Account Script [MySQL R7, cache functions, easydialog, Whirlpool, salted passwords] ReneG Gamemode Scripts 71 02/03/2014 11:48 AM
[GameMode] MySQL Account Script BlueG MySQL plugin R31 (cache method) Aliassassin123456 Gamemode Scripts 10 23/02/2014 12:09 PM
[GameMode] MySQL CLEAN GAMEMODE [Whirlpool, MySQL BlueG R7, Cache, Ready Package (Windows)] GiamPy. Gamemode Scripts 13 13/09/2013 04:31 PM
BlueG MySQL plugin - Failed (plugins/mysql.so: undefined symbol: _Z13stringvprintfPKcPc) linuxthefish Plugin Development 10 13/07/2013 10:56 AM
[Tool/Web/Other] MySQL DB Manager - Easily manage your MySQL databases with this remote application fiki574 Tools and Files 13 22/07/2012 09:41 AM


All times are GMT. The time now is 05:31 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.