Автор: Andrew
Следуй за синей птичкой
В интернете какая-то эпидемия. Многие сломя голову, как малые дети бросились вести свои твиттер мини-дневники. Сейчас к этой истерии присоединился и Google со своим Buzz. В 140 символов можно вставить только одно малоосмысленное предложение. Лента сообщений напоминает бесполезную переписку с помощью эсэмэсок с сокращениями, когда в наименьшее кол-во символов пытаются вставить как можно больше информации.
Особенно меня бесят эти сокращённые ссылки, по которым не видно на какой сайт переходишь. Всё это напоминает мне маленьких детей, вот для них то наверное и предназначен твиттер: «я покушал кашку», «ух ты, какую?», «вкусную», «а я сходила на горшок», «а сегодня мама купила мне машшшинку..», «а у меня, а у меня.. а у меня вот что есть!». Единственное на что годится твиттер (и ему подобные) так это для анонсов (но это по сути дублирует RSS) и как чат в реальном режиме времени для подростков.
Я провожу в интернете по 8 часов в день, у меня в Google Reader около полусотни интереснейших блогов и RSS лент, но я не успеваю нормально прочитать и трети из них. Я не могу воспринимать эти ленты, хотя каждый день достаточно много читаю. Наверное я уже слишком старый, или наоборот ещё не повзрослел… =)
Command & Conquer
Electronic Arts выложило для бесплатного скачивания полные версии (со всеми видео роликами, как полагается) три первых части Command & Conquer: Tiberium Dawn, Red Alert, Tiberium Sun (+адд-он Firestorm).
Качать тут: http://www.commandandconquer.com/classic
Эх были времена. Command & Conquer вышел в 95 году и шокировал своей графикой, игровым процессом, музыкой. Помню, запускался даже на компьютере с 386 процессором (играл у друга, у меня компьютер гораздо позже появился). Вот Westwood умела делать раньше стратегии. До сих пор интересно иногда переигрывать. Не то что сейчас.
Реквием по Windows Mobile
Анекдот. Сегодня появились сообщения, что новая разрабатываемая версия Windows Mobile 7 будет однозадачной, не совместимой с предыдущими версиями и программы можно будет устанавливать только через онлайновую службу. Т.е. по сути полностью содранная с iPhone ОС.
Источник: http://soft.compulenta.ru/503554/
Видимо Microsoft решила задушить своё детище собственными руками. По-моему мнению Windows Mobile (у меня на HTC Diamond стоит версия 6.1) с оболочкой от HTC (заменяющей все основные приложения на свои) не так плоха. Просто юзабилити у этой ОС нужно доработать как следует (в том числе и для управления пальцами).
Рыба дот ком
Сегодня с утра ездили закупаться в рыбный магазин. Увидел лоток с рыбой «СOM» и с минуту стоял, смотрел и тупил, как же может быть так, чтобы рыба называлась интернет-доменом. =) Наверное, я уже потерян для общества =)
История спутниковых снимков в Google Earth
Оказывается теперь можно видеть историю спутниковых снимков для любой местности в Google Earth! Отличная возможность я вам скажу!
Кстати, насчёт даты спутниковой съемки Минска в Google Maps и Яндекс Картах я угадал. В Google Maps Минск за 11 августа 2009, а в Яндексе за 22 апреля. Те и те снимки есть в Google Earth. Самые ранние снимки Минска есть за 2001 год.
Оптимизация MySQL
Да уж, 9 лет занимаюсь веб-разработками, а в оптимизации сайтов и базы данных MySQL в частности, каждый раз нахожу для себя много нового. Проблема в том, что во время разработки сложно оценить все узкие места, они возникают когда в базе появляются тысячи, десятки тысяч или даже миллионы записей в таблицах. Тут я собрал разные полезные фишки и советы, связанные с оптимизацией MySQL открытые мной в последнее время.
PROCEDURE ANALYSE()
Стандартная функция, которая анализирует поля таблицы в запросе и выводит советы по оптимальной длине/типу полей. Например SELECT * FROM table PROCEDURE ANALYSE().
Известно, что использование типа полей занимающего большую память делает более медленной работу с таблицами. Enum быстрее чем Varchar, varchar быстрее чем text, medium int быстрее чем int и т.д. Часто можно оптимизировать типы в зависимости от данных в таблице.
Определение не эффективных индексов
Индексы в таблицах — большое благо, но не стоит забывать что кроме того, что индексы ускоряют выборки из таблицы (SELECT) они замедляют обновление таблиц (UPDATE) и добавление новых полей (INSERT), так как при каждом обновлении данных все индексы перестраиваются. Также индексы занимают место на диске. В таблицах где данные часто обновляются/добавляются использование индексов должно быть сбалансированным.
С помощью этого хитрого запроса можно увидеть 10 самых малоэффективных индексов во всей базе данных:
SELECT t.TABLE_SCHEMA AS `db`, t.TABLE_NAME AS `table`, s.INDEX_NAME AS `inde name`, s.COLUMN_NAME AS `field name`, s.SEQ_IN_INDEX `seq in index`, s2.max_columns AS `# cols`, s.CARDINALITY AS `card`, t.TABLE_ROWS AS `est rows`, ROUND(((s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) * 100), 2) AS `sel %` FROM INFORMATION_SCHEMA.STATISTICS s INNER JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME INNER JOIN (SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, MAX(SEQ_IN_INDEX) AS max_columns FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA != ‘mysql’ GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME) AS s2 ON s.TABLE_SCHEMA = s2.TABLE_SCHEMA AND s.TABLE_NAME = s2.TABLE_NAME AND s.INDEX_NAME = s2.INDEX_NAME WHERE t.TABLE_SCHEMA != ‘mysql’ AND t.TABLE_ROWS > 10 AND s.CARDINALITY IS NOT NULL AND (s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) < 1.00 ORDER BY `sel %`, s.TABLE_SCHEMA, s.TABLE_NAME LIMIT 10;
Взято отсюда: http://pastebin.com/f6b1c381c. Уберите LIMIT 10, чтобы увидеть статистику по всем индексам.
EXPLAIN — Определение используемых индексов и строк, которые нужно обработать MySQL базе данных для выполнения запроса.
Очень просто, добавляем к нашему запросу слово EXPLAIN. Например: EXPLAIN SELECT * FROM table WHERE var=value ORDER BY field. Очень полезно для просмотра эффективности индексов.
Полный отказ от ORDER BY rand();
Конструкция ORDER BY rand(); отдаёт поля из таблицы в случайном порядке. Основная засада в том, что при выполнении этой конструкции не используются индексы и осуществляется полное сканирование таблицы. Уже при нескольких тысячах записей могут начаться проблемы. Разумно переписать код, чтобы все записи брались из базы данных, добавлялись в массив и сортировались в массиве (shuffle в PHP). Если записей очень много, имеет смысл сделать кеширование — например делать случайную сортировку раз в час.
Отключить InnoDB если он не нужен
Это движки таблиц. MyISAM — быстрее и проще, InnoDB — умеет много полезного, например транзакции, отсутствие блокировок. Если все эти фишки не нужны, то кто-то советует оставаться на MyISAM, кто-то наоборот переходить на InnoDB. Я пока ещё этот вопрос для себя не решил и использую MyISAM.
В любом случае если InnoDB не используется стоит отключить его поддержку, т.к. сервер кушает лишнюю память и работает медленее. Для отключения добавляем skip-innodb в конфиг (/etc/mysql/my.cnf).
Медленные запросы
Некоторые запросы выполняются очень медленно. Скорей всего о большинстве них вы и не подозреваете, т.к. вы тестировали когда в таблице было несколько сотен записей, а сейчас там несколько десятков тысяч и т.д. Найти такие запросы, на которые стоит обратить самое пристальное внимание, можно если включить логгирование Slow Queries. В конфиг файле (/etc/mysql/my.cnf) прописываем:
log_slow_queries = /var/log/mysql/mysql-bin.log
long_query_time = 2
2 — это количество секунд, больше которых выполняемый запрос будет считаться медленным и добавляться в лог. Если добавить ещё строчку log-queries-not-using-indexes в логи будут добавляться все запросы, для которых не использованы индексы.
Затем перегружаем MySQL сервер (/etc/init.d/mysql restart) и в /var/log/mysql будут добавлятся файлы логов с медленными запросами за последние 7 дней (по умолчанию).
Кеширование в MySQL
Стоит конечно писать скрпиты так, чтобы запросов в базу данных было как можно меньше, но часть ваших проблем на себя может взять MySQL. Правильная настройка кеширования приведёт к тому, что повторяющиеся запросы будут браться из кеша и выполняться очень быстро. У меня например 75% запросов выполняется из кеша. Конечно, этот процент зависит от типа запросов, от размера самого кеша, от частоты запросов к базе данных и т.д. Обычно стандартная конфигурация не всегда подходит, т.к. для разной нагрузки нужны разные настройки. Чтобы узнать что менять, смотрим следующий пункт.
Автоматический тюнинг
С помощью простой утилитки mysqltuner можно обнаружить самые основные узкие места в конфигурации MySQL.
Выполняем на сервере:
wget http://mysqltuner.com/mysqltuner.pl
chmod u+x mysqltuner.pl
./mysqltuner.pl
Далее нужно ввести root логин и пароль к MySQL серверу, а скрипт проанализирует данные и выведет советы в автоматическом режиме. Я меняю параметры в конфиге, на которые нужно обратить внимание, а затем через несколько дней смотрю опять.
Также полезные советы можно посмотреть в phpMyAdmin если нажать ссылку «Текущее состояние MySQL» на главной странице.
Минимизирование изменения таблиц
Добавление или изменения данных в таблицы приводит к тому, что перестраиваются все индексы и сбрасывается кэш таблицы. Хорошо, если в таблице немного записей. У меня в нескольких проектах есть таблицы в которых несколько миллионов записей, благодаря индексам выборки из таблиц происходят быстро, но при изменении таблицы и при одновременном обращении к ней, происходит резкое замедление выполнения выборок (запросы SELECT).
Это я вот к чему, иногда для оптимизации работы с базой данных имеет смысл переделать логику работы скриптов. Например, я сейчас делаю кеширование, чтобы все обновления сохранялись в небольшой временной таблице, а добавление всех данных в большую таблицу (и её изменение) происходило только раз в сутки.
Оптимизация таблиц
Иногда следует выполнять OPTIMIZE TABLE, т.к. таблицы со временем фрагментируются из-за изменения, добавления данных и скорость доступа к ним, со стороны дисковой системы сервера уменьшается.
Полезные ссылки по Оптимизации MySQL:
20 Советов по оптимизации MySQL
Сервер на стероидах
MySQL Optimization
Google Maps vs Yandex Maps
Ну что же. Свершилось. Наконец-то добрались и до Минска.
Google Maps обновил карту пятилетней давности. Раньше снимки были настолько старые, что на них не было множество новых домов. Сейчас спутниковые снимки примерно прошлого лета (2009). Что приятно прописали все улицы и на карте стали появляться номера домов. Но пока далеко не все, примерно процентов 20-30 от общего количества в Минске. Но стоит сразу отметить качество карты выше чем у Яндекса — т.к. в той части где присутствуют дома, есть все дворовые проезды и есть названия различных строений (рынки, школы..).
Сегодня Минск опубликовал и Yandex. Yandex чуть опередил Google, они сразу опубликовали достаточно актуальную карту. На карте есть все дома и работает поиск по номеру дома. Спутниковые снимки чуть более ранние, чем у Google — примерно середина-конец весны 2009. И там и там снимки примерно одинакового качества, но у Google слегка более чёткие и контрастные (возможно просто потому что больше зелени).
Сводная таблица:
Google Maps | Yandex Maps | |
Завершенность карты | 20-30 % от всего города | 100 % |
Номера домов | Да | Да |
Названия строений | Да | Нет |
Остановки транспорта | Да | Нет |
Прокладка маршрута | Частично | Нет |
Пробки | Нет | Нет |
Дворовые проезды | Да | Нет |
Направление движения на дорогах | Да | Нет |
Спутниковая карта | ~ лето 2009 | ~ весна 2009 |
Карта от Google более функциональная и лучше, но не закончена, поэтому пока нужно пользоваться картой от Яндекс. Радует, что теперь для поиска нужного дома можно не пользоваться старой программой CityInfo, с кучей рекламы и кошмарной пародией на карту map.by.
Странная проблема с Wi-fi
Вчера у моего модема (Zyxel 660 HTW2 EE) вдруг пропал Wi-fi. Ноутбук и коммуникатор просто перестали видеть сеть, хотя до этого никаких проблем не было.
Начал разбираться, потратил два часа — пробовал так и эдак, заново настраивал wi-fi, сбрасывал настройки на заводские, установил три разных прошивки, менял схемы подключения, степень шифрования и частотный диапазон wi-fi, ворочал модем, крутил антеннку в разные стороны. Перепробовал всё, что только можно. Не работает, хоть тресни. Собирался уже в начале недели везти модем в сервис, а потом решил в последний раз отключить все провода от модема, и подключить заново. Начал подключать постепенно и вдруг чудо, заработало!
Оказывается, каким-то странным образом, на работу Wi-fi влияет сетевой кабель проведённый к телевизору. Когда сетевой кабель от телевизора подключен, то Wi-fi работает нестабильно через раз, когда отключен — работает без вопросов. В общем проблема крайне странная, наверное причина в какой-то хитрой помехе или в каком-то статическом напряжении. Для себя сделал вывод, что к настройке сети нужно подходить по-особому, т.к. ждать можно чего угодно =)
Картофельное сердце
Зажарили и съели!