Программирование >>  Создание клиентов mysql 

1 ... 149 150 151 [ 152 ] 153 154 155 ... 201


Приложение может дотировать информацию, извлекаемую из базы данных. Это выгодно, если данные меняются нечасто. Когда изменение данных все же происходит, приложение запрашивает принудительную очистку буфера. Предположим, что в Intemet-магазине имеется каталог продаваемых товаров. Этот каталог пополняется или обновляется раз в неделю, а то и меньше. Когда приложение отправляет клиенту НТМЬч:траницу с описанием товара, оно вполне может взять информацию из кэша. Если администратор захочет воспользоваться приложением для обновления цены товара, он должен будет очистить кэш.

То же самое применимо и в отношении программных блоков. Если нужно узнать название, цену и категорию товара, введите один запрос и сохраните полученные значения в программных переменных. Основная работа по выборке данных заключается в поиске нужной записи. Не имеет особого значения, 100 или 1000байтов извлекаются из нее.

Оптимизация запросов

Незаметно для пользователей программа MySQL оптимизирует предложения WHERE инструкции SELECT. Обычно не нужно заботиться о том, сколько скобок указано в выражении или каков порядок таблиц в объединении. Вместо этого сосредоточьтесь на индексах. Они позволяют ускорить операции выборки данных за счет замедления операций записи. Конечно, индексы занимают дополнительное место на диске, но они незаменимы с точки зрения эффективной организации таблиц.

Когда программа MySQL извлекает данные из таблицы, ей достаточно просмотреть один индексный столбец, чтобы найти нужные записи и не сканировать всютаб-лицу. Если к объединенной таблице применимы два индекса, программа выбирает из них который позволит прочесть меньшее число записей.

Разрешается создавать индекс, охватывающий несколько столбцов. Программа MySQL может работать с частями индекса, но они должны просматриваться строго слева направо. Например, если индекс включает столбцы имени и фамилии, то при обращении к первому столбцу индекс будет использован, а ко второму - нет (при ус-что перед этим не было обращения к первому столбцу). Это правило применимо и к символам индексируемого столбца, содержащего текстовые данные (тип CHAR, VARCHAR или BLOB). Когда в предложении WHERE присутствует оператор LIKE, индекс лишь в том случае, если шаблон сравнения содержит все лите-

ральные символы слева, а справа. Так, шаблон разрешает ис-

пользование индекса, ашаблон abc%xyz - нет.

В листинге 26.2 приведены инструкции, создающие две таблицы. Таблица word будет содержать 14346 записей, а таблица dictionary- 104237. В первую таблицу слова заносятся пользователями, а вторая таблица содержит список известных программе слов. Пользователи часто вводят несуществующие слова. Запрос, анализируемый в листинге 26.3, предназначен для выяснения количества распознанных слов. Условию отбора соответствую! 1 записей.



sql> EXPLAIN SELECT word.word, dictiona.word

-> FROM word LEFT JOIN dictiona

-> ON word.word=dictiona.word

-> WHERE word.class = VERBO \G

*************************** 1 row ** *************************

table: word

type: ALL

possible keys: NULL

key: NULL

key len: NULL

ref: NULL

rows: 14346 Extra: where used

table: dictionary

type: ALL

possible keys: NULL

key: NULL

key len: NULL



ref: NULL rows: 104237 Extra:

2 rows in set (0.00 sec)

В запросе участвуют три столбца: столбцы word ss таблицы word и столбец word таблицы dictionary. Известно, что тестовому условию отбора соответствуют 911 записей таблицы word, поэтому наша задача состоит в том, чтобы сократить диапазон сканирования первой таблицы до соответствующего уровня. Для этого необходимо создать индекс по столбцу class. Сначала я планировал включить в индекс только упомянутый столбец, но потом подумал о других запросах, которые приходится направлять таким таблицам. Я, например, часто создаю отчет, в который включается все содержимое таблицы, отсортированное сначала по классам, а затем - по словам. Разумнее будет включить в индекс сразу два столбца (листинг 26.4).

ALTER TABLE word

ADD INDEX (class, word)

Теперь инструкция EXPLAIN выдает другие результаты (листинг 26.5). В поле key len сообщается том, что индекс охватывает 16 символов столбца class. По оценке программы MySQL, ей придется просмотреть 1517 записей, хотя мы знаем, что их всего 911.

mysql> EXPLAIN SELECT word.word, dictionary.word

-> FROM word LEFT JOIN dictionary

-> ON word-word=dictionary.word

-> WHERE word.class = VERBO \G

table: word

type: ref

possible keys: class

key: class

keylen: 16

ref: const

rows: 1517

Extra: where used; Using index

table: dictionary

type: ALL

possible keys: NULL

key: NULL

key len: NULL

ref: NULL

rows: 104237 Extra:

2 rows in set (0.00 s)



1 ... 149 150 151 [ 152 ] 153 154 155 ... 201

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика