Документация MySQL

30.08.2007

Клиентская библиотека почти безопасна при использовании в мультипоточном
режиме. Наибольшая проблема заключается в том, что функции в
'net.c'
,
читающие из сокетов, не поддерживают прерываний. Они были спроектированы
исходя из предположения, что пользователь может захотеть иметь свой
собственный аварийный сигнал, который способен прерывать слишком долгое
чтение с сервера. При установке обработчиков прерываний для прерывания
управление сокетами должно быть поддерживающим потоки.
В более ранних бинарных поставках MySQL, которые мы (разработчики MySQL)
распространяли с нашего веб-сайта (
), клиентские
библиотеки обычно не компилировались с возможностью поддержки потоков
(бинарные поставки для Windows по умолчанию компилируются как
поддерживающие потоки). Более новые бинарные поставки должны иметь как
нормальную, так и поддерживающую потоки клиентскую библиотеку.
Чтобы получить поддерживающую потоки клиентскую программу с возможностью
прерывать ее из других потоков и устанавливать блокировки по времени при
соединении с сервером MySQL, необходимо использовать библиотеки
,
, а также код
'net_serv.o'
, используемый
данным сервером.
Если нет необходимости в прерываниях или временных блокировках, то можно
просто скомпилировать поддерживающую потоки клиентскую библиотеку
(
) и использовать ее (see section ). В этом случае
нет необходимости заботиться об объектном файле net_serv.o или других
библиотеках MySQL.
Если необходимо применять временные блокировки и прерывания при
использовании поддерживающего потоки клиента, то можно с успехом
использовать подпрограммы из файла
'thr_alarm.c'
. При использовании
подпрограмм из библиотеки mysys следует помнить только о том, что сначала
следует вызвать функцию
! See section
.
Все функции, за исключением
, по умолчанию являются
поддерживающими потоки. Ниже приводятся рекомендации, как следует
компилировать поддерживающую потоки клиентскую библиотеку и использовать
ее в этом режиме (замечания по функции
, но поскольку функция
не рекомендуется, то в любом случае следует использовать функцию
).
поддерживающей потоки,
необходимо перекомпилировать клиентскую библиотеку со следующей командой:
shell> ./configure --enable-thread-safe-client
(предполагается, что данная операционная система включает поддерживающую
потоки функцию
). Эта библиотека является поддерживающей
потоки для данного соединения. Можно позволить двум потокам использовать
одно и то же соединение со следующими оговорками:
Два потока не могут посылать запрос серверу MySQL в одно и то же время
на одном и том же соединении. В особенности необходимо быть уверенным,
что в промежутках между вызовом функций
никакой другой поток не использует это же
соединение.
Многие потоки имеют доступ к различным результирующим наборам данных,
извлекаемых функцией
.
необходимо быть уверенным,
что никакой другой поток не использует это же соединение, пока данный
результирующий набор не будет обработан. Однако действительно
наилучший вариант для потоковых клиентов, совместно использующих одно
и то же соединение, - это применять функцию
.
Если необходимо использовать большое количество потоков на одном и том
же соединении, то следует иметь синхронизирующую блокировку в
отношении вызова комбинации функций
. Как только выполнение функции
заканчивается, данная блокировка может сниматься
и другие потоки могут запрашивать это же самое соединение.
, то можно
использовать функции
для
установки и освобождения синхронизирующей блокировки.
Необходимо знать следующее: если имеется вызываемый функцией MySQL поток,
который не создавал данное соединение с базой данных MySQL, то:
MySQL создаст
специальные переменные для этого потока, которые (среди прочих применений)
используются библиотекой отладки.
При вызове функции MySQL до того, как поток вызвал функции
, данный поток в этом случае не будет иметь необходимых
специальных переменных потока и, вероятно, программа рано или поздно умрет
с дампом оперативной памяти.
при запуске данной программы, если она
вызывает какую-либо другую функцию MySQL до вызова функции
.
в обработчике потока до вызова
иной функции MySQL.
. Это освободит память, занятую специальными переменными
потока для MySQL.
Следует учитывать, что можно получить некоторые ошибки из-за наличия
неопределенных символов при связывании клиента с библиотекой
. В большинстве случаев это происходит вследствие того,
что в строку связывания/компилирования не включены библиотеки потока.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Рубрики: Без рубрики |

Оставить комментарий

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.

Документация MySQL

30.08.2007

Что касается MySQL 3.23.23, то эта версия MySQL поддерживает
полнотекстовый поиск и индексацию. Полнотекстовые индексы в MySQL
обозначаются как индексы типа
. Эти индексы могут быть созданы в
столбцах
.
Загрузка больших массивов данных в таблицу будет происходить намного
быстрее, если таблица не содержит индекс
, который затем
создается командой
). Загрузка данных в
таблицу, уже имеющую индекс
, будет более медленной.
.
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 ...'),
(0,'How To Use MySQL Efficiently', 'After you went through a ...'),
(0,'Optimising MySQL','In this tutorial we will show ...'),
(0,'1001 MySQL Trick','1. Never run mysqld as root. 2. ...'),
(0,'MySQL vs. YourSQL', 'In the following database comparison ...'),
(0,'MySQL Security', 'When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6 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 ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
выполняет поиск в естественном языке, сравнивая строку с
содержимым текста (совокупность одного или более столбцов, включенных в
индекс
). Строка поиска задается как аргумент в выражении
. Поиск выполняется без учета регистра символов. Для каждой
строки столбца в заданной таблице команда
возвращает величину
релевантности, т.е. степень сходства между строкой поиска и текстом,
содержащимся в данной строке указанного в списке оператора
столбца.
(см. пример выше),
возвращенные строки столбцов автоматически сортируются, начиная с наиболее
релевантных. Величина релевантности представляет собой неотрицательное
число с плавающей точкой. Релевантность вычисляется на основе количества
слов в данной строке столбца, количества уникальных слов в этой строке,
общего количества слов в тексте и числа документов (строк), содержащих
отдельное слово.
Поиск возможен также в логическом режиме, это объясняется ниже в данном
разделе.
. Строки возвращаются в порядке уменьшения релевантности.
В следующем примере показано, как извлекать величины релевантности в явном
виде. В случае отсутствия выражений
возвращаемые строки
не упорядочиваются.
mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
| 1 | 0.64840710366884 |
| 2 | 0 |
| 3 | 0.66266459031789 |
| 4 | 0 |
| 5 | 0 |
| 6 | 0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)
Следующий пример - более сложный. Запрос возвращает значение релевантности
и, кроме того, сортирует строки в порядке убывания релевантности. Чтобы
получить такой результат, необходимо указать
дважды. Это не
приведет к дополнительным издержкам, так как оптимизатор MySQL учтет, что
эти два вызова
идентичны, и запустит код полнотекстового поиска
только однажды.
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 | score |
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 |
| 6 | When configured properly, MySQL ... | 1.31140957288 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
Для разбивки текста на слова MySQL использует очень простой синтаксический
анализатор. ''Словом'' является любая последовательность символов,
состоящая из букв, чисел, знаков
. Любое ''слово'',
присутствующее в стоп-списке (stopword) или просто слишком короткое (3
символа или меньше), игнорируется.
Каждое правильное слово в наборе проверяемых текстов и в данном запросе
оценивается в соответствии с его важностью в этом запросе или наборе
текстов. Таким образом, слово, присутствующее во многих документах, будет
иметь меньший вес (и даже, возможно, нулевой), как имеющее более низкое
смысловое значение в данном конкретном наборе текстов. С другой стороны,
редко встречающееся слово получит более высокий вес. Затем полученные
значения весов слов объединяются для вычисления релевантности данной
строки столбца.
Описанная техника подсчета лучше всего работает для больших наборов
текстов (фактически она именно для этого тщательно настраивалась). Для
очень малых таблиц распределение слов не отражает адекватно их смысловое
значение, и данная модель иногда может выдавать некорректные результаты.
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)
Поиск по слову ''MySQL'' в предыдущем примере не приводит к каким-либо
результатам, так как это слово присутствует более чем в половине строк. По
существу, данное слово целесообразно трактовать как стоп-слово (т.е.
слово с нулевой смысловой ценностью). Это наиболее приемлемое решение -
запрос на естественном языке не должен возвращать каждую вторую строку из
таблицы размером 1Гб.
Маловероятно, что слово, встречающееся в половине строк таблицы,
определяет местонахождение релевантных документов. На самом деле, наиболее
вероятно, что будет найдено много не относящихся к делу документов.
Общеизвестно, что такое случается слишком часто при попытке найти что-либо
в Интернет с помощью поисковых машин. Именно на этом основании подобным
строкам должно быть назначено низкое смысловое значение в данном
конкретном наборе данных.
В MySQL 4.0.1 возможен полнотекстовый поиск также и в логическом режиме с
использованием модификатора
.
mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+------------------------------+-------------------------------------+
| id | title | body |
+----+------------------------------+-------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 2 | How To Use MySQL Efficiently | After you went through a ... |
| 3 | Optimising MySQL | In this tutorial we will show ... |
| 4 | 1001 MySQL Trick | 1. Never run mysqld as root. 2. ... |
| 6 | MySQL Security | When configured properly, MySQL ... |
+----+------------------------------+-------------------------------------+
Данный запрос вывел все строки, содержащие слово ''MySQL'' (заметьте,
50-процентная пороговая величина здесь не используется), но эти строки не
содержат слова ''YourSQL''. Следует отметить, что логический режим поиска
не сортирует автоматически строки в порядке уменьшения релевантности. Это
видно по результату предыдущего запроса, где строка с наиболее высокой
релевантностью (содержащая слово ''MySQL'' дважды) помещена последней, а
не первой. Логический режим полнотекстового поиска может работать даже без
индекса
, хотя и очень медленно.
Предшествующий слову знак ''плюс'' показывает, что это слово должно
присутствовать в каждой возвращенной строке.
Предшествующий слову знак ''минус'' означает, что это слово не должно
присутствовать в какой-либо возвращенной строке.
По умолчанию (если ни плюс, ни минус не указаны) данное слово является не
обязательным, но содержащие его строки будут оцениваться более высоко. Это
имитирует поведение команды
MATCH() ... AGAINST()
.
Эти два оператора используются для того, чтобы изменить вклад слова в
величину релевантности, которое приписывается строке. Оператор
уменьшает
этот вклад, а оператор
- увеличивает его. См. пример ниже.
Круглые скобки группируют слова в подвыражения.
Предшествующий слову знак ''тильда'' воздействует как оператор отрицания,
обуславливая негативный вклад данного слова в релевантность строки. Им
отмечают нежелательные слова. Строка, содержащая такое слово, будет
оценена ниже других, но не будет исключена совершенно, как в случае
оператора - ''минус''.
Звездочка является оператором усечения. В отличие от остальных операторов,
она должна добавляться в конце слова, а не в начале.
Фраза, заключенная в двойные кавычки, соответствует только строкам,
содержащим эту фразу, написанную буквально.
находит строки, содержащие по меньшей мере одно из этих слов.
... оба слова.
... слово ''apple'', но ранг строки выше, если она также содержит слово
''macintosh''.
... слово ''apple'', но не ''macintosh''.
... ''apple'' и ''pie'', или ''apple'' и ''strudel'' (в любом порядке), но
ранг ''apple pie'' выше, чем ''apple strudel''.
... ''apple'', ''apples'', ''applesauce'', и ''applet''.
... ''some words of wisdom'', но не ''some noise words''.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Рубрики: Без рубрики |

Оставить комментарий

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.