|
Программирование >> Создание клиентов mysql
Приложение может дотировать информацию, извлекаемую из базы данных. Это выгодно, если данные меняются нечасто. Когда изменение данных все же происходит, приложение запрашивает принудительную очистку буфера. Предположим, что в 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)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |