SA-MP Forums Archive
MySQL (F.A.Q.) - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: MySQL (F.A.Q.) (/showthread.php?tid=489467)

Pages: 1 2 3 4 5 6 7 8 9


MySQL (F.A.Q.) - Stepashka - 22.01.2014

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

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

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

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

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

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

Ключи

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

Дата и время

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

F.A.Q.


Re: MySQL (F.A.Q.) - Stepashka - 22.01.2014

Code:
 SET NAMES cp1251;
 SET SESSION character_set_server='utf8';
Не забываем что всеми любимый phpmyadmin по умолчанию работает не на utf8, не забываем его перенастроить.


Что такое лэйблы и как использовать as. - Stepashka - 22.01.2014

Иногда происходит необходимость произвести сложный запрос, с обращением в две или более таблиц, или упростить имя столбца в результирующих данных, как же быть?!
Для этого в 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 нельзя.

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


Re: MySQL (F.A.Q.) - hub4 - 23.01.2014

до лейблов все тоже вполне неплохо читалось) имхо только уменьшение длины.
ты лучше другое обьясни. разве для многотабличных запросов не JOIN надо пользовать?
каким образом в твоем первом примере сервер определяет по каким параметрам в какой таблице искать?


Re: MySQL (F.A.Q.) - Stepashka - 23.01.2014

Quote:
Originally Posted by hub4
View Post
до лейблов все тоже вполне неплохо читалось) имхо только уменьшение длины.
ты лучше другое обьясни. разве для многотабличных запросов не JOIN надо пользовать?
каким образом в твоем первом примере сервер определяет по каким параметрам в какой таблице искать?
А ты умеешь правильно пользоваться JOIN? Лучше их избегать.
По сути это проблема MySQL, а вообще FROM не указывает что выборка должна производится из этих таблиц, оно указывает какие таблицы будут использоваться в запросе, а вот WHERE уже формирует запрос и по его условиям сервер производит выборку, в данном случае он сперва выберет пользователей, а потом для каждого пользователя сделает подзапрос во вторую таблицу и сопоставит данные.


Re: MySQL (F.A.Q.) - Urukhay - 23.01.2014

Хотелось бы более конкретного описания с примерами создание ключей.


Re: MySQL (F.A.Q.) - Nazarik - 27.01.2014

Как лучше всего хранить данные, например для лицензии. (a,b,c,d)
В 1 поле ? "0|0|0|0"
или под каждую лицензию свое поле ?


Re: MySQL (F.A.Q.) - Splav - 27.01.2014

Quote:
Originally Posted by Nazarik
View Post
Как лучше всего хранить данные, например для лицензии. (a,b,c,d)
В 1 поле ? "0|0|0|0"
или под каждую лицензию свое поле ?
Как удобнее тебе


Re: MySQL (F.A.Q.) - Stepashka - 27.01.2014

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


Re: MySQL (F.A.Q.) - ZiGGi - 27.01.2014

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


Re: MySQL (F.A.Q.) - Alexander_Petrov - 09.02.2014

Инсерт не работает с лимитом


Re: MySQL (F.A.Q.) - stabker - 10.02.2014

Помогите сформулировать запрос. Нужно достать biz.*, а так же поле users.name AS owner_name, где biz.owner_id = users.id если biz.owned (если нет, в owner_name возвращать что-то другое, либо "").


Re: MySQL (F.A.Q.) - Stepashka - 10.02.2014

Quote:
Originally Posted by stabker
View Post
Помогите сформулировать запрос. Нужно достать biz.*, а так же поле users.name AS owner_name, где biz.owner_id = users.id если biz.owned (если нет, в owner_name возвращать что-то другое, либо "").
Code:
SELECT
	*,
	IFNULL((SELECT name FROM users WHERE biz.owner_id = users.id), '') AS owner_name
FROM biz
WHERE owned



Re: MySQL (F.A.Q.) - stabker - 10.02.2014

Quote:
Originally Posted by Stepashka
View Post
Code:
SELECT
	*,
	IFNULL((SELECT name FROM users WHERE biz.owner_id = users.id), '') AS owner_name
FROM biz
WHERE owned
Спасибо! Теперь буду знать. Только мне, скорее, нужно так:

Code:
SELECT
	*,
	IF(biz.owned, (SELECT name FROM users WHERE biz.owner_id = users.id), "") AS owner_name
FROM biz



Re: MySQL (F.A.Q.) - Stepashka - 10.02.2014

Quote:
Originally Posted by stabker
View Post
Спасибо! Теперь буду знать. Только мне, скорее, нужно так:

Code:
SELECT
	*,
	IF(biz.owned, (SELECT name FROM users WHERE biz.owner_id = users.id), "") AS owner_name
FROM biz
это разные запросы.
В первом случае получит все дома у которых есть владельцы, а потом дополнит полученные данные именами владельцев или пустотами.
Во втором, получить все дома и потом дополнит их все именами владельцев или пустотами.


Re: MySQL (F.A.Q.) - stabker - 10.02.2014

Quote:
Originally Posted by Stepashka
View Post
это разные запросы.
В первом случае получит все дома у которых есть владельцы, а потом дополнит полученные данные именами владельцев или пустотами.
Во втором, получить все дома и потом дополнит их все именами владельцев или пустотами.
Я понимаю, поэтому мне как раз второй вариант и нужен.


Re: MySQL (F.A.Q.) - Urukhay - 13.02.2014

Quote:
Originally Posted by Stepashka
View Post
Code:
SELECT
	*,
	IFNULL((SELECT name FROM users WHERE biz.owner_id = users.id), '') AS owner_name
FROM biz
WHERE owned
А зачем использовать 'AS owner_name' в Вашем запросе?


Re: MySQL (F.A.Q.) - Stepashka - 13.02.2014

Quote:
Originally Posted by Urukhay
View Post
А зачем использовать 'AS owner_name' в Вашем запросе?
что бы в получившихся данных столбец имел имя owner_name, если этого не делать имя будет IFNULL((SELECT name FROM users WHERE biz.owner_id = users.id), '').
Согласен что для sa-mp это не принципиально так как столбцы вытаскиваются порядковым номером.


Re: MySQL (F.A.Q.) - Urukhay - 13.02.2014

После проделывания опытов с табличкой, в которой был столбец k_id (AI + уникальный) и столбец s_id (Primary Key), я решил пересоздать столбец k_id, тобишь я удалял строки, и у меня оставались строки с k_id 1,5,6. Ну а мне надо чтобы все были по порядку с единицы. Ну я удалил столбец с АI k_id, ибо его изменять нельзя.. А создать снова не получается, пишет "multiple primary key defined". А он не был первичным.


Re: MySQL (F.A.Q.) - Stepashka - 13.02.2014

Quote:
Originally Posted by Urukhay
View Post
После проделывания опытов с табличкой, в которой был столбец k_id (AI + уникальный) и столбец s_id (Primary Key), я решил пересоздать столбец k_id, тобишь я удалял строки, и у меня оставались строки с k_id 1,5,6. Ну а мне надо чтобы все были по порядку с единицы. Ну я удалил столбец с АI k_id, ибо его изменять нельзя.. А создать снова не получается, пишет "multiple primary key defined". А он не был первичным.
AI поля по умолчанию Primary Key.
И в который раз повторяю: НИ КОГДА НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ ТРОГАЙТЕ И НЕ ИЗМЕНЯЙТЕ AI ПОЛЯ!