MySQL — вопросы и ответы

Какая функция возвращает количество рядов результата MySQL запроса?

mysql_num_rows — Возвращает количество рядов результата запроса

 

Что такое mysql_pconnect? Чем он отличается от mysql_connect?

Устанавливает постоянное соединение с сервером MySQL.

mysql_pconnect() работает аналогично mysql_connect() с двумя важными отличиями.

Во-первых, при соединении функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.

Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования ( mysql_close() также не закрывает постоянные соединения, открытые mysql_pconnect()).

Соединения такого типа называют ‘постоянными’.

 

Данное расширение устарело, начиная с версии PHP 5.5.0, и будет удалено в будущем. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:

 

 

 

Что такое реляционная база данных?

Базой данных (БД) называется организованная в соответствии с определенными правилами и поддерживаемая в памяти компьютера совокупность сведений об объектах, процессах, событиях или явлениях, относящихся к некоторой предметной области, теме или задаче. Она организована таким образом, чтобы обеспечить информационные потребности пользователей, а также удобное хранение этой совокупности данных, как в целом, так и любой ее части.

 Реляционная база данных представляет собой множество взаимосвязанных таблиц, каждая из которых содержит информацию об объектах определенного вида. Каждая строка таблицы содержит данные об одном объекте (например, автомобиле, компьютере, клиенте), а столбцы таблицы содержат различные характеристики этих объектов — атрибуты (например, номер двигателя, марка процессора, телефоны фирм или клиентов).

 

 

Что такое первичный ключ?

Первичынй ключ — вот представьте себе книжку, все страницы пронумерованы, вторую страницу с одинаковым номером не воткнёшь, отсюда понимаем что первичный ключ является уникальным идентификатором объекта.

Индекс — опять представьте себе книжку, Вы когда читаете её интересные места помечаете закладками, для быстрого доступа потом к данному месту, а не роясь по том по всей книге в поисках, а где же это было. Аналогично и с индексом (они бывают разные конечно) — но в общем, это система указаний где какая информация лежит, что бы искать прямым переходом а не полным перебором…

 

 

Что такое нормализация и денормализация?

Нормализация: 

Нормализация является основным термином в теории баз данных, ведь именно благодаря ей удается избавиться от лишних данных и сократить ошибки в данных.

 То есть, грубо говоря, нормализация — это удаление из базы данных избыточности.

 Обычно избыточность удаляют с помощью приведения базы данных к нормальным формам (характеризует базу данных с точки зрения избыточности). Выделяют несколько различных нормальных форм (до восьми), но — обычно хватает трех нормальных форм.

 Первая нормальная форма — данные атомарны (только одно значение в столбце), вторая НФ — когда база находится в первой НФ и значения всех не ключевых атрибутов можно узнать по первичному ключу (не ключевые атрибуты функционально зависят от первичного ключа). Третья НФ — когда база данных находится во второй НФ и по не ключевым атрибутам нельзя определить первичный ключ (нет транзитивных зависимостей не ключевых атрибутов от первичного ключа).

 Нормализация необходима для защиты БД от ошибок обновления, удаления данных и их избыточности.

 

Денормализация:

 Денормализация — это процесс, обратный нормализации. То есть — введение избыточности данных в БД.

 Денормализацию применяют тогда, когда надо упростить процедуру чтения данных, а также — когда есть множество соединений таблиц (не надо будет лезть куда-то — все находится в одной таблице).

 Денормализация — это не ошибка программиста, это — специально сделанный процесс (именно денормализация).

 

 

Что такое MyISAM и InnoDB? Чем они отличаются?

MyISAM и InnoDB — это системы хранения данных в СУБД MySQL. В таблице ниже приведены различия между ними:

 

Описание

MyISAM

InnoDB

Транзакционный движек?

Транзакция (Transaction) – блок операторов SQL , который в случае ошибки в одном запросе, возвращается к предыдущему состоянию (Rollback), и только в случае выполнения всех запросов подтверждается (Commit)

Нет

Да

Поддержка внешних ключей

Внешние ключи – это способ связать записи в двух таблицах по определенным полям так, что при обновлении поля в родительской автоматически происходит определенное изменение поля в дочерней (дочернюю и родительскую выбираешь при создании ключа; точнее, создаешь ключ в дочерней, который ссылается на родительскую).

Нет

Да

Блокировка.

Блокировка на уровне строк, т.е. если процессу нужно обновить строку в таблице, то он блокирует только эту строку, позволяя другим обновлять другие строки параллельно

Блокировка на

уровне таблиц

Блокировка на

уровне строк

Одновременные запросы к разным частям таблицы.

Медленнее

Быстрее

При смешанной нагрузке в таблице

(select/update/delete/insert)

Медленнее

Быстрее

Операция Insert

Быстрее

Медленнее, ибо есть

оверхед на

транзакцию, но это

цена надежности

Deadlock

Deadlock — ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, захваченных самими этими процессами.

Не возникает

Возможно

Поддержка полнотекстового поиска

Да

Нет

Запрос Count(*)

Быстрее

Медленнее

Поддержка mysqlhotcopy

Утилита mysqlhotcopy представляет собой Perl-сценарий, использующий SQL-команды LOCK TABLES, FLUSH TABLES и Unix-утилиты cp или scp для быстрого получения резервной копии базы данных.

Да

Нет

Файловое хранение таблиц

Каждой таблице

отдельный файл

Данные при

настройках по

умолчанию хранятся в

больших совместно

используемых файлах

Бинарное копировании таблиц?

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

Да

Нет

Размер таблиц в БД

Меньше

Больше

Поведение в случае сбоя

Крашится вся таблица

По логам можно все

восстановить

В случае хранения «логов» и подобного

Лучше

Хуже

Выводы: 

  • Использовать MyISAM лучше в таблицах, которых преобладает один вид доступа: чтение (новостной сайт) или запись (например, логирование) ;

  • Использование InnoDB имеет смысл во всех остальных случаях и случаях повышенных требований по сохранности данных.

 

 

Что такое SQL-инъекция?

Про SQL-инъекции в PHP Manual’e

 

 

Какая разница между LEFT, RIGHT и INNER JOIN?

Основное различие в том, как соединяются таблицы, если нет общих записей.

 Простой JOIN — тоже самое что INNER JOIN и означает показывать только общие записи обоих таблиц. Каким образом записи считаются общими определяется полями в join-выражении. Например следующая запись:

FROM t1 JOIN t2 on t1.id = t2.id

означает что будут показаны записи с одинаковыми id, существующие в обоих таблицах.

 LEFT JOIN (или LEFT OUTER JOIN) означает показывать все записи из левой таблицы (той, которая идет первой в join-выражении) независимо от наличия соответствующих записей в правой таблице.

 RIGHT JOIN (или RIGHT OUTER JOIN) действует в противоположность LEFT JOIN — показывает все записи из правой (второй) таблицы и только совпавшие из левой (первой) таблицы.

 

 

Чем отличается WHERE от HAVING?

Конструкция HAVING отличается от конструкции WHERE в следующем.

WHERE Clause (Конструкция WHERE)

HAVING Clause (Конструкция HAVING)

Работает с рядами данных до группировки.

Работает с результирующим множеством после группировки.

Условия не могут выражаться с помощью функций множества (например, SUM или AVG), но могут быть использованы псевдонимы столбцов для неагрегированных выражений.

Условия могут быть выражены посредством любой функции множества или псевдонимом столбца.

 

 

Что можешь сказать про команду GROUP BY?

Предложение GROUP BY используется для определения групп выходных строк, к которым могут применяться агрегатные функции (COUNT, MIN, MAX, AVG и SUM). Если это предложение отсутствует, и используются агрегатные функции, то все столбцы с именами, упомянутыми в SELECT, должны быть включены в агрегатные функции, и эти функции будут применяться ко всему набору строк, которые удовлетворяют предикату запроса. В противном случае все столбцы списка SELECT, не вошедшие в агрегатные функции, должны быть указаны в предложении GROUP BY. В результате чего все выходные строки запроса разбиваются на группы, характеризуемые одинаковыми комбинациями значений в этих столбцах. После этого к каждой группе будут применены агрегатные функции. Следует иметь в виду, что для GROUP BY все значения NULL трактуются как равные, т.е. при группировке по полю, содержащему NULL-значения, все такие строки попадут в одну группу.

Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы. Эту возможность, наряду с ключевым словом DISTINCT, можно использовать для исключения дубликатов строк в результирующем наборе.

 

Что делает команда EXPLAIN?

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

Статья на хабре

 

IN, NOT IN, IS NULL, IS NOT NULL,BETWEEN 

Предикат BETWEEN проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словом AND. Естественно, как и для предиката сравнения, выражения в предикате BETWEEN должны быть совместимы по типам.

SELECT model, speed FROM Pc WHERE price BETWEEN 400 AND 600; 

Предикат [NOT] IN определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который либо явно определен, либо получен с помощью табличного подзапроса. Табличный подзапрос это обычный оператор SELECT, который создает одну или несколько строк для одного столбца, совместимого по типу данных со значением проверяемого выражения. Если целевой объект эквивалентен хотя бы одному из указанных в предложении IN значений, истинностное значение предиката IN будет равно TRUE. Если для каждого значения Х в предложении IN целевой объект<>X, истинностное значение будет равно FALSE. Если подзапрос выполняется, и результат не содержит ни одной строки (пустая таблица), предикат принимает значение FALSE. Когда не соблюдается ни одно из упомянутых выше условий, значение предиката равно UNKNOWN.

SELECT model, speed, hd FROM Pc WHERE hd IN (10, 20);

Предикат IS [NOT] NULL позволяет проверить отсутствие (наличие) значения в полях таблицы. Использование в этих случаях обычных предикатов сравнения может привести к неверным результатам, т.к. сравнение со значением NULL дает результат UNKNOWN (неизвестно).

Так, если требуется найти записи в таблице Pc, для которых в поле price отсутствует значение (поиск ошибок ввода), можно воспользоваться следующим оператором:

SELECT * FROM Pc WHERE price IS NULL;

Реклама