Автор работы: Пользователь скрыл имя, 21 Марта 2011 в 09:42, курсовая работа
Современная жизнь немыслима без эффективного управления. Важной категорией являются системы обработки информации, от которых во многом зависит эффективность работы любого предприятия или учреждения. Такая система должна:
* обеспечивать получение общих и/или детализированных отчетов по итогам работы;
* позволять легко определять тенденции изменения важнейших показателей;
* обеспечивать получение информации, критической по времени, без существенных задержек;
* выполнять точный и полный анализ данных.
Введение……………………………………………………………………….……3
Основная часть………………………………….…………………………….…….5
1.Базы данных и СУБД………………………..…………………………...………5
1.1.Понятие банка данных, базы данных и СУБД…………………….....………5
1.2. Функции СУБД………………………………………………………...…..…..8
1.3. Модели данных, поддерживаемые СУБД……………………………….….10
1.4. Области применения баз данных в экономике……………………….…….11
2.Обзор MySQL…………………………………………………………………...12
2.1. Базисные команды клиента MySQL………………………………………...12
2.2.Команды транзакций и блокировок в MySQL………………………………13
2.3.Полнотекстовый поиск в MySQL……………………………………………19
Заключение………………………………………………………………………..25
Глоссарий …………………………………………………………………………26
Если Вы собираетесь выполнять много операций на связке таблиц, намного быстрее блокировать таблицы, которые Вы собираетесь использовать. Конечно, никакой другой поток не может модифицировать блокированную на READ таблицу, и никакой поток не сможет читать блокированную на WRITE таблицу. Причина того, что некоторые вещи выполняются быстрее под LOCK TABLES в том, что MySQL не будет сбрасывать на диск кэш ключей для блокированных таблиц до вызова UNLOCK TABLES (обычно кэш ключей сбрасывается на диск после каждой инструкции SQL). Это ускоряет вставки, удаления и обновления на таблицах MyISAM.
Если Вы используете драйвер таблицы в MySQL, который не поддерживает транзакции, Вы должны использовать LOCK TABLES, если Вы хотите гарантировать, что никакой другой поток не обработается между SELECT и UPDATE. Пример, показанный ниже, требует LOCK TABLES, чтобы выполниться безопасно:
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> select sum(value) from trans where customer_id= some_id;
mysql>
update customer set total_value=sum_from_previous_
where customer_id=some_id;
mysql> UNLOCK TABLES;
Без LOCK TABLES имеется возможность, что другой поток может вставлять новую строку в таблице trans между выполнением инструкций SELECT и UPDATE.
Используя инкрементные модификации (UPDATE customer SET value=value+new_value) или функцию LAST_INSERT_ID(), Вы во многих случаях можете избежать использования LOCK TABLES.
Вы можете также решать некоторые проблемы, используя функции GET_LOCK() и RELEASE_LOCK(). Эти блокировки сохранены в таблице hash на сервере и выполнены через вызовы pthread_mutex_lock() и pthread_mutex_unlock() для ускорения работы. Дополнительные функции ".
Вы можете блокировать все таблицы во всех базах данных с блокировками чтения командой FLUSH TABLES WITH READ LOCK. Это очень удобный способ получать резервные копии, если Вы имеете файловую систему, подобную Veritas, которая может делать кадры состояния.
ОБРАТИТЕ ВНИМАНИЕ: LOCK TABLES не транзакционно-безопасна и автоматически завершает любые активные транзакции перед попыткой блокировать таблицы.
Синтаксис SET TRANSACTION:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
Устанавливает уровень изоляции транзакции глобально, для целого сеанса или следующей транзакции.
Заданное по умолчанию поведение должно установить уровень изоляции для следующей (не начатой) транзакции.
Если Вы устанавливаете привилегию GLOBAL, это будет воздействовать на все новые созданные потоки. Вы будете нуждаться в привилегии PROCESS, чтобы сделать это.
Установка привилегии SESSION будет воздействовать на следующую и на все будущие транзакции.
Синтаксис HANDLER:
HANDLER table OPEN [AS alias]
HANDLER table READ index {=|>=|<=|<} (value1, value2, ...)
[WHERE ...] [LIMIT ...]
HANDLER table READ index {FIRST|NEXT|PREV|LAST} [WHERE ...] [LIMIT ...]
HANDLER table READ {FIRST|NEXT} [WHERE ...] [LIMIT ...]
HANDLER table CLOSE
Команда HANDLER обеспечивает прямой доступ к интерфейсу таблиц MySQL, совершая обход SQL-оптимизатора. Таким образом, это работает быстрее, чем SELECT.
Первая форма инструкции HANDLER открывает таблицу, делая ее доступной через следующий вызов HANDLER ... READ.
Вторая форма выбирает одну (или определенное предложением LIMIT число) строку, где определенный индекс соответствует условию и определение WHERE выполнено. Если индекс состоит из нескольких частей (промежутки более, чем в несколько столбцов) значения должны быть определены в разделяемом запятыми списке.
Третья форма выбирает одну (или определенное предложением LIMIT число) строку в индексном порядке, соответствуя условиям определения WHERE запроса.
Четвертая форма (без индексной спецификации) выбирает одну (или определенное предложением LIMIT число) строку из таблицы в естественном порядке строк (как они сохранены в файле данных), соответствуя условиям определения WHERE запроса. Это быстрее, чем HANDLER table READ index, когда нужен полный просмотр таблицы.
Последняя форма закрывает таблицу, открытую с помощью вызова HANDLER ... OPEN.
HANDLER
это инструкция низкого уровня, например,
она не обеспечивает непротиворечивость.
Вызов HANDLER ... OPEN НЕ блокирует таблицу.
Так что другие потоки могут работать
с таблицей и менять данные.
2.3.Полнотекстовый
поиск в MySQL
Начиная с Version 3.23.23, MySQL имеет поддержку для полнотекстовой индексации и поиска. Полнотекстовые индексы в MySQL представляют собой индекс типа FULLTEXT. Индекс FULLTEXT может быть создан из столбцов VARCHAR и TEXT в вызове CREATE TABLE или добавлен позже через инструкции ALTER TABLE или CREATE INDEX. Для больших наборов данных, добавление индекса FULLTEXT через ALTER TABLE (или CREATE INDEX) намного быстрее, чем вставка строк в пустую таблицу с индексом.
Поиск выполняется с помощью функции MATCH.
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO articles VALUES
-> (0,'MySQL Tutorial', 'DBMS stands for DataBase Management ...'),
-> (0,'How To Use MySQL Efficiently', 'After you went through a ...'),
-> (0,'Optimizing MySQL','In this tutorial we will show how to ...'),
-> (0,'1001 MySQL Trick','1. Never run mysqld as root. 2. Normalize ...'),
-> (0,'MySQL vs. YourSQL', 'In the following database comparison we ...'),
-> (0,'MySQL Security', 'When configured properly, MySQL could be ...');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('database');
+----+-------------------
|
id | title
| body
+----+-------------------
| 5 | MySQL vs. YourSQL | In the following database comparison we ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase Management ... |
+----+-------------------
2 rows in set (0.00 sec)
Функция MATCH соответствует запросу естественного языка для текстовой совокупности AGAINST, которая является просто набором столбцов, покрытых индексом FULLTEXT). Для каждой строки в таблице это возвращает релевантность: меру подобия между текстом в этой строке (в столбцах, которые являются частью совокупности) и запросом. Когда это используется в предложении WHERE (см. пример выше) возвращенные строки автоматически сортируются с уменьшением релевантности. Релевантность представлена неотрицательным числом с плавающей запятой. Нулевая релевантность означает, что нет никакого подобия.
Вышеупомянутое представляет собой базисный пример использования функции MATCH. Строки будут возвращены с уменьшением релевантности.
mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles;
+----+-------------------
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-------------------
| 1 | 0.64840710366884 |
|
2 |
| 3 | 0.66266459031789 |
|
4 |
|
5 |
|
6 |
+----+-------------------
5 rows in set (0.00 sec)
Этот пример показывает, как найти релевантность. Поскольку предложения WHERE или ORDER BY не присутствуют в запросе, возвращенные строки не упорядочиваются.
mysql> SELECT id, body, MATCH (title,body) AGAINST (
-> 'Security implications of running MySQL as root') AS score
-> FROM articles WHERE MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root');
+----+-------------------
|
id | body
+----+-------------------
| 4 | 1. Never run mysqld as root. 2. Normalize ... | 1.5055546709332 |
| 6 | When configured properly, MySQL could be ... | 1.31140957288 |
+----+-------------------
2 rows in set (0.00 sec)
Это более сложный пример: запрос возвращает релевантность и дополнительно сортирует строки с ее уменьшением. Чтобы достичь этого, нужно определить MATCH дважды. Обратите внимание, что это не вызовет никакой перегрузки, так как оптимизатор MySQL обратит внимание, что эти два обращения MATCH идентичны, и вызовут код поиска только однажды.
MySQL использует очень простой синтаксический анализатор, чтобы расчленить текст на слова. Слово является любой последовательностью символов, чисел, знаков ' и _. Любое слово, которое присутствует в списке stopword или слишком короткое (3 символа или меньше), игнорируется.
Каждое правильное слово в совокупности и в запросе взвешивается, согласно значению в запросе или совокупности. Этим путем слово, которое присутствует во многих строках, будет иметь более низкий вес (и может даже иметь нулевой вес) потому, что оно имеет более низкое семантическое значение в этой специфической совокупности. Иначе, если слово редко, оно получит более высокий вес. Веса слов затем будут сложены, чтобы вычислить релевантность.
Такая методика работает лучше всего с большими совокупностями (фактически, это было тщательно настроено на этот путь). Для очень маленьких таблиц распределение слов не отражает адекватно их семантическое значение, и эта модель может производить причудливые результаты.
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)
Поиск слова MySQL не производит никаких результатов в вышеупомянутом примере. Слово MySQL присутствует больше, чем в половине строк, и обрабатывается как stopword (то есть с семантическим значением, равным нулю).
Слово, которое соответствует половине строк в таблице, менее вероятно определяет релевантные документы. Фактически, наиболее вероятно, что поиск по нему найдет множество несоответствующих документов. Все мы знаем, что это случается очень часто, когда мы пробуем что-то поискать в Internet... Таким строкам были назначены низкие семантические значения в этом специфическом наборе данных.
Все параметры для функции MATCH должны быть столбцами из той же самой таблицы, которая является частью того же самого индекса.
Параметром AGAINST должна быть строка-константа.
Подстройка полнотекстового поиска MySQL. Обратите внимание, что поиск был тщательно настроен для самой лучшей эффективности. Изменение заданного по умолчанию поведения будет, в большинстве случаев, делать результаты поиска хуже. Не изменяйте исходники MySQL, если Вы не знаете точно, что Вы делаете!
Минимальная длина слова, которое будет индексировано определена в файле myisam/ftdefs.h строкой