Задавайте вопросы, мы ответим
Вы не зашли.
Есть базовые знания mysql
понимаю всякие простые вещи вроде "SELECT * FROM table1 WHERE table1.status = 1"
Туториалы в сети все какие то упрощенные... там простые таблицы и простые примеры...
Читая запросы со всякими там GROUP BY и JOIN ни как не могу зацепится за логику что бы на автомате понимать суть... И надеюсь поняв, смогу научится составлять запросы.
Мне сложно объяснить, но как то все в запросах не линейно что ли, наоборот как то... не могу понять в общем..
Посоветуйте у кого как было и кто как решал такое непонимание (если оно было)
Может какой то ясный и понятный курс есть?
Неактивен
Для чтения запросов нужно понимать порядок операций. Тогда можно мысленно поставить скобки и порядок исполнения станет линейным. Полезно читать EXPLAIN запросов, особенно EXPLAIN EXTENDED. Читая последний становится понятно какой порядок операций.
Если совсем примитивно, то нужно читать так:
1. читать часть FROM таблица1 JOIN таблица2 ON поле1=поле2 JOIN таблица3 USING(поле3)
это таблицы, к которым идет обращение, а для их объединения используются условия ON, USING и часть условий WHERE, которые связывают таблицы
2. читать часть WHERE (кроме частей, которые использованы для JOIN) - это дополнительные условия отбора ко всем строками, отобранным в 1
3. ORDER BY, GROUP BY - применяются в конце к итогу
4. LIMIT - в самом конце оставляет не все строчки
5. в последную очередь можно посмотреть на перечень полей после SELECT и перед FROM. Значения именно этих полей попадут в результат. Для понимания запроса эта часть не так важна, как она важна для оптимизации. * на этом месте обычно приводит к выборке лишних данных большого объема.
Неактивен
Спасибо, по упражнялся и все стало как то яснее )
А можно как то по простому пояснить по поводу ключей.
К примеру возьмем запрос из mysql-slow.log где есть всякие join
Это просто пример запроса
SELECT
it.ItemId AS ID,
it.ref AS REF,
it.tipo AS TYPE,
it.state AS ACTIVE,
ci.IdItem AS CatID,
c.nameEn AS TypeCategoryEn
FROM
item AS it
LEFT JOIN
category_item AS ci ON (ci.IdItem = it.ItemId)
LEFT JOIN
category AS c USING (IdCategory)
WHERE
it.state = 1
Читал что лучше и быстрее это будет работать если использовать для этого индекс.
Правильно ли я понимаю что мне нужно добавить индексы в поля где я использую сравнения или USING?
Как понять куда и когда нужно ставить индекс, и вообще нужен ли он?
Ставить индекс и выполнять запрос сравнивая время выполнения?
Неактивен
пусть таблица это книга, тогда индекс - алфавитный указатель.
чтобы найти предложения, в которых встречается заданное слово, можно или прочитать всю книжку, или воспользоваться алфавитным указателем.
соответственно, индекс нужно ставить на те поля, который используются для нахождения строк, т.е в части WHERE и JOIN
вопросы индексирования хорошо описаны в
Шварц Б., Зайцев П., Ткаченко В. MySQL. Оптимизация производительности (2-е издание, 2010)
в сети есть копии.
и посмотрите FAQ №5
Неактивен