ЗаметкиMariaDB 10.0 vs Mysql 5.5

Присутствовал сегодня на одном очень интересном собеседовании. Интересно оно было вопросами собеседующего — их было достаточно много и все были с заковырками. Но один из вопросов меня заинтересовал больше всего. Звучит он примерно так:

Какой индекс необходимо создать, для быстрого выполнения следующего запроса:

SELECT
	*
FROM
	`table`
WHERE
	`status` = 1 AND
	`cityId` = 55 AND
	`date_start` > "2016-04-20" AND
	`date_end` < "2016-04-31";

Я про себя ответил точно так-же, как собеседуемый — создать составной индекс, покрывающий все поля в WHERE. Какого-же было мое удивления, когда собеседующий сказал, что это не совсем правильно и в индексе не нужно поле date_end — оно не принесет пользы, только место займет. Я сильно удивился и как добрался домой — решил проверить.
MariaDB 10.0 vs Mysql 5.5 →

Заметки, ПроектыПростая SQL-задача

Время от времени приходится решать не тривиальные задачи. Одна из последних: получить даты, когда были какие-либо записи. В день может быть 84600 записей на пользователя (по количеству секунд), соответственно в месяц около 2 600 000 на пользователя. Пользователей — не ограничено (тестировалось на базе в пару сотен пользователей). Индексы проставлены.

Казалось-бы, все элементарно и просто:

SELECT
	DATE_FORMAT(`date`, '%Y-%m-%d') as `fdate`
FROM
	`user_coord`
WHERE
	`user` = '4' AND
	`date` > '2013-09' AND
	`date` < '2013-10'
GROUP BY
	`fdate`

Но, мы же помним, что GROUP BY = зло? Да и время выполнения запроса, 1.5 — 2 секунды, совсем не устраивает. Включаем мозг…
Простая SQL-задача →

ЗаметкиОптимизация кривых рук

Дело было вечером, делать было нечего… Ну, почти. Как бы там ни было, но я случайно открыл исходный код главной страницы своего блога и охр..нел. Вот что я увидел в подвале:

<!-- 25.98MB; 413 запросов. 4.343 сек. -->

Сначала не поверил глазам: удалил кеш, перепроверил содержимое файлов, удалил плагины — не помогло. Как так?
Оптимизация кривых рук →

Заметки, ПроектыMD5 и скорость выборки

Пару дней назад завязался небольшой диалог в твиттере по поводу шифрования паролей в веб-сервисах. На фразу «кто не использует — идиот» мне ответили в стиле:

Шифрование создает сильную дополнительную нагрузку для веб-сервиса и большие проекты избегают подобного.

Подобное я слышу уже в сотый раз, поэтому решил сделать маленький тест и показать, что это абсолютно не верно и создатели этих сервисов (в которых важные данные, такие как пароли, номера карт и пр., не шифруются) полные идиоты.

Собственно, сам тест очень простой. Я создал таблицу, в которой 3 поля:

  1. id — привычка;
  2. str — данные в открытом виде (в тесте совпадает с id);
  3. pass — хешированные данные (md5(id)).

Таблицу заполнил 10000-ми строками. Теперь сами тесты:

mysql_connect('openserver', 'root', NULL) or die('err connect');
mysql_select_db('md5') or die('err select db');

$start = microtime(TRUE);
for($i=1;$i<=10000;$i++)
{
mysql_query('SELECT FROM `str` WHERE `str`="'.$i.'" LIMIT 1');
//    mysql_query('SELECT FROM `str` WHERE `pass`=MD5("'.$i.'") LIMIT 1');
//    mysql_query('SELECT FROM `str` WHERE `pass`="'.md5($i).'" LIMIT 1');
}

echo microtime(TRUE) - $start;

Из кода видно, что я проверяю 3 типа запросов:

  1. запрос по не хешированной строке;
  2. запрос по md5, хеширование внутри mysql;
  3. запрос по md5, хеширование в php.

MD5 и скорость выборки →