SELECT
и других запросов
EXPLAIN
(получение информации о SELECT
)SELECT
WHERE
DISTINCT
LEFT JOIN
и RIGHT JOIN
ORDER BY
LIMIT
INSERT
UPDATE
DELETE
Buy this Reference Manual in softcover from Barnes & Noble!
WHERE
Описание оптимизации выражений WHERE
помещено в раздел, посвященный SELECT
, потому что они главным образом используются в запросах SELECT
, но для выражений WHERE
в операторах DELETE
и UPDATE
используются те же способы оптимизации.
Отметим также, что данный раздел неполон. В MySQL реализовано много возможностей оптимизации, и у нас не было времени, чтобы задокументировать их все.
Ниже перечислены некоторые из оптимизации, выполняемых MySQL:
((a AND b) AND c OR (((a AND b) AND (c AND d)))) -> (a AND b AND c) OR (a AND b AND c AND d)
(a b>5 AND b=c AND a=5
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6) -> B=5 OR B=6
HEAP
и MyISAM
функция COUNT(*)
, которая вызывается для одной таблицы и не содержит предложения WHERE
, берется непосредственно из табличной информации. Это делается также для любого выражения NOT
NULL
, в котором используется только одна таблица.SELECT
неосуществимы и не возвращают строк.HAVING
с WHERE
, если не используется предложение GROUP BY
или групповые функции (COUNT(), MIN()...
).WHERE
, чтобы ускорить оценку WHERE
для каждого подчиненного связывания а также чтобы пропустить записи как можно быстрее.WHERE
для индекса UNIQUE
, или PRIMARY KEY
, где все части индекса используются с константными выражениями и части индекса определены как NOT NULL
.mysql> SELECT * FROM t WHERE primary_key=1; mysql> SELECT * FROM t1,t2 -> WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
ORDER BY
и GROUP BY
принадлежат одной таблице, эта таблица рассматривается первой при связывании.ORDER BY
и отличное от него выражение GROUP BY
, или если выражения ORDER BY
или GROUP BY
содержат столбцы не только из первой таблицы в очереди на связывание, но и из других таблиц, то тогда создается временная таблица.SQL_SMALL_RESULT
, MySQL будет применять временную таблицу, которую разместит в памяти.HAVING
.Вот некоторые примеры очень быстрых запросов:
mysql> SELECT COUNT(*) FROM tbl_name; mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; mysql> SELECT MAX(key_part2) FROM tbl_name -> WHERE key_part_1=constant; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1,key_part2,... LIMIT 10; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
Для выполнения следующих запросов используется только индексное дерево (предполагается, что индексированные столбцы числовые):
mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; mysql> SELECT COUNT(*) FROM tbl_name -> WHERE key_part1=val1 AND key_part2=val2; mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
Следующие запросы используют индексацию, чтобы получить отсортированные строки без дополнительного прохода для сортировки:
mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1,key_part2,... ; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1 DESC,key_part2 DESC,... ;
Posted by on Monday February 17 2003, @7:54pm | [Delete] [Edit] |
(I'm not sure this is proper place for this issue. tell me where to go that i should move this comment.)
mysql version: 3.23.27-beta
perl: v5.6.1 built for MSWin32-x86-multi-thread
apache: Apache/1.3.26 (Win32)
there're titles and two of them are titled as "asdljf - Psychic Vampire asldkfjad" and "Psychic Vampire? (asdfdf".
when i query like the following at the mysql console:
ex> select count(*) from bbs_1000 where user<>'' and ( title like '%psy%' );
result: 2
but when i query the same through perl source using DBI(), nothing resulted.
i think i might need to upgrade. when i make 'psy' upper cases, resulted properly.
sorry, so complicate to write down here all. anybody suffering the same case? -- Hyungjin Ahn([email protected])
Add your own comment.