У меня есть большая таблица MySQL InnoDB (около 1 миллионных записей, увеличение на 300 тысяч в неделю), скажем, с сообщениями в блоге. В этой таблице есть поле url с индексом.Использование MD5 (URL) вместо URL-адреса в DB для WHERE
Добавляя в него новые записи, я проверяю существующие записи с тем же адресом. Вот как запрос выглядит следующим образом:
SELECT COUNT(*) FROM `tablename` WHERE url='http://www.google.com/';
система В настоящее время производит около 10-20 запросов в секунду, и эта сумма будет увеличена. Я думаю об улучшении производительности, добавив дополнительное поле, которое является хешем MD5 URL.
SELECT COUNT(*) FROM `tablename` WHERE md5url=MD5('http://www.google.com/');
Таким образом, он будет короче и с постоянной длиной, которая лучше для индекса по сравнению с полем URL. Что вы, ребята, думаете об этом. Имеет ли это смысл?
Другое предложение моего друга - использовать CRC32 вместо MD5, но я не уверен, насколько уникальным будет результат CRC32. Позвольте мне знать, что вы думаете о CRC32 для этой роли.
UPDATE: столбец URL уникален для каждой строки.
Я думал, что «некластеризованная» была терминологией SQL Server - не следует ли считать, что это просто индекс? –
некластеризованные индексы являются «виртуальными» индексами данных, тогда как кластеризованные индексы являются физическими индексами данных. У вас может быть только один кластеризованный индекс для каждой таблицы, в то время как вы можете иметь несколько некластеризованных индексов в одной таблице –
Согласовано, индекс NC будет иметь такую же или аналогичную производительность, что и добавление MD5 или другого хэша. Если у вас высокое отношение записей таблиц на URL-адресе, я бы рассмотрел структуру двух таблиц, в которой поддерживаются уникальные URL-адреса, например, tblUrls и tablename будут хранить только соответствующий ключ. Это может немного увеличить производительность вставки, а также уменьшить требования к хранению и иметь несколько других преимуществ в зависимости от основного приложения. – mjv