SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.10.2007 04:45:03

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Сравнение текстовых полей.

Господа, что вы думаете по следующему вопросу.

Допустим есть две таблицы, в одной (t1) есть колонка типа text
в другой (t2) есть тоже колонка типа текст + колонка с хэшем текстового поля md5(текст), по которой есть индекс.

Если мне нужно сравнить два значения из разных колонок допустим в where, то какой вариант будет быстрее и почему?

SELECT * FROM t1,t2

WHERE t1.text = t2.text

или

SELECT * FROM t1,t2

WHERE md5(t1.text) = t2.md5

Неактивен

 

#2 30.10.2007 20:54:57

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Сравнение текстовых полей.

Второй вариант скорее всего быстрее, так как будет использован индекс, но все зависит от числа строк в таблицах. Лучше всего в первой таблице тоже иметь поле с md5(text), которое можно поддерживать в актуальном состоянии триггерами.

Неактивен

 

#3 30.10.2007 22:24:05

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Сравнение текстовых полей.

Индекс лучше всего иметь в той таблице, в которой значительно больше записей, так как по второй таблице будет в таком случае перебор всех значений. Хеш-индексы лучше, чем индексы по текстовому полю, так как они
1. более случайны, то есть практически исключены общие куски (например, чтобы понять, что "корова" и "коробка" отличаются, надо сравнить первые 5 символов, тогда как их хеши отличаются скорее всего уже в первом символе)
2. занимают меньше места (кстати, индексы по текстовому полю могут быть не более 1000 байт, так что полного сравнения по индексу не произойдет)

В данном случае хеш-индекс Вы создаете руками (как B-Tree индекс над полем равным hash(text)). Оптимальнее конечно использовать механизм хранения со встроенными хеш-индексами, но пока это только ndb и memory). Если Вам потребуется сравнивать текст без учета регистра, то md5 следует заменить на md5(lower(text))

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson