2016-01-05 4 views
1

Мне нужно сохранить xml-строки в MySQL-DB с очень простой структурой таблиц.Поиск длинной строки в большой базе данных mysql

xml_ID int(10), xml text 

При вставке новой строки я хочу проверить наличие дубликатов. Моя БД содержит почти более 10 тыс. Элементов, а сравнение с ГДЕ происходит очень медленно. Поэтому я решил добавить столбец и заполнить его контрольными суммами строк.

xml_ID int(10), xml text, md5 binary(32) 

Поскольку контрольная сумма не является биникой для строки, я могу не только сравнить контрольные суммы. Поэтому мне по-прежнему приходится сравнивать сами строки.

Теперь на мой вопрос: Что происходит быстрее/лучше? Избранная запрос, содержащий 2, где условия, такие как:

SELECT xml_ID 
FROM table 
WHERE 
    md5=MD5('<content>hello</content>') AND 
    xml='<content>hello</content>' 

или запрос с использованием подзапроса как:

SELECT xml_ID 
FROM (
    SELECT * 
    FROM table 
    WHERE md5=MD5('<content>hello</content>') 
    ) AS t 
WHERE xml='<content>hello</content>' 

я тестировал его до сих пор, но оба запроса необходимо почти в то же время для результата.

Обязательна ли контрольная сумма?

Я также открыты для любых других предложений ...

Спасибо ...

+0

Первая версия должна быть немного быстрее. Если вы создали контрольную сумму и все еще нуждаетесь в сравнении строк, в чем смысл? У вас есть индексы на этой таблице? –

+0

xml_ID - это первичный ключ, и нет других индексов, и никаких других колонок ..... и сравнение строк не требуется, потому что контрольная сумма ist not biunique ...... моя идея с использованием контрольной суммы уменьшает результаты для прямого сравнение строк –

+0

Сначала база данных будет использовать индекс MD5, если она доступна. Первый запрос будет немного быстрее. –

ответ

0

Даже скудное MD5 менее вероятно, чтобы иметь дубликат, чем это для вас, чтобы выиграть мега лотерею в то в то же время, когда астероид попадает на Землю.

Так, просто

SELECT ... 
    FROM ... 
    WHERE md5 = MD5(...); 

и имеют INDEX(md5) - отсутствие индекса, вероятно, почему это происходит медленно.

В таблице из 9 триллионов md5's есть только один шанс в 9 триллионах, что у вас есть те же два md5 для разных строк.

Внимание! Если ваш индекс на md5 слишком велик для кэширования, производительность будет страдать. (10K строк не должно быть проблемой.)

Смежные вопросы