четверг, 17 ноября 2011 г.

7.2.1. Optimizing Queries with EXPLAIN

Перевод главы документации MySQL.

Комманда EXPLAIN может использоваться или как способ получить информацию о том, как MySQL выполняет запрос, или как синоним комманды DESCRIBE:
  • Когда мы ставим ключевое слово EXPLAIN перед выражением SELECT, MySQL отображает информацию о плане выполнения запроса из оптимизатора. То есть MySQL объясняет ход выполнения запроса, включая информацию о том, какие таблицы объединяются и в каком порядке. Для получения дополнительной информации можно использовать EXPLAIN EXTENDED.
    Следующая секция поясняет, как использовать EXPLAIN и EXPLAIN EXTENDED, чтобы получить информацию о плане выполнения запроса.
  • EXPLAIN PARTITIONS доступен начиная с версии MySQL 5.1.5. Эта комманда полезна только, когда проверяет запросы, касающиеся partitioned (раздельных? секцированных?) таблиц. Смотреть детально Section 17.3.4, “Obtaining Information About Partitions”.
  • EXPLAIN tbl_name синоним комманды DESCRIBE tbl_name или SHOW COLUMNS FROM tbl_name. Более подробную информацию о DESCRIBE и SHOW COLUMNS можно посмотреть здесь Section 12.8.1, “DESCRIBE Syntax” и здесь Section 12.7.5.6, “SHOW COLUMNS Syntax”.
С помощью EXPLAIN вы можете увидеть где нужно добавить индексы в таблицах, так чтобы запрос выполнялся быстрее использую индексы для нахождения строк. Можно также использовать EXPLAIN для того, чтобы проверить объединяет ли оптимизатор таблицы в оптимальном порядке. Чтобы подсказать оптимизатору использовать порядок объединения соответствующий порядку, в котором таблицы перечислены в запросе SELECT нужно перед ключевым словом SELECT указать STRAIGHT_JOIN. (Смотреть Section 12.2.8, “SELECT Syntax”.)
Если у вас есть проблемы с индексами, которые не используются, когда вы считаете что должны использоваться, запустите ANALYZE TABLE, чтобы обновить статистику таблицы, такую как количество ключей, которые влияют на выбор, который делает оптимизатор. См. Section 12.7.2.1, “ANALYZE TABLE Syntax”.

четверг, 15 апреля 2010 г.

HTML5. Элемент nav

Продолжаем знакомится с html5.

Элемент nav [^]

Категории, которым принадлежит этот элемент:
Flow content.
Sectioning content.
formatBlock candidate.
Контекст, в котором этот элемент может быть использован:
Где ожидается flow content.
Контент:
Flow content.
Атрибуты:
Global attributes
Элемент nav представляет часть страницы, которая содержит ссылки на другие страницы или части на этой же странице: это секция навигационных ссылок.
Не все группы ссылок на странице должны содержаться в элементе nav - должны содержаться только те секции, которые содержат в себе основные навигационные блоки. В частности, распространенной ситуацией для футера является, когда в низу страницы располагается короткий список ссылок на разные страницы сайта, например, соглашение пользователя, домашняя страница, авторские права. Элемент footer не требует наличия элемента nav, для этих целей.

В следующем примере страница содержит несколько частей из ссылками, но только одна такая часть содержится в секции навигации.

<body>
 <header>
  <h1>Wake up sheeple!</h1>
  <p><a href="news.html">News</a> -
     <a href="blog.html">Blog</a> -
     <a href="forums.html">Forums</a></p>
  <p>Last Modified: <time>2009-04-01</time></p>
  <nav>
   <h1>Navigation</h1>
   <ul>
    <li><a href="articles.html">Index of all articles</a></li>
    <li><a href="today.html">Things sheeple need to wake up for today</a></li>
    <li><a href="successes.html">Sheeple we have managed to wake</a></li>
   </ul>
  </nav>
 </header>
 <div>
  <article>
   <header>
    <h1>My Day at the Beach</h1>
   </header>
   <div>
    <p>Today I went to the beach and had a lot of fun.</p>
    ...more content......more blog posts...
   </div>
   <footer>
    <p>Posted <time pubdate datetime="2009-10-10T14:36-08:00">Thursday</time>.</p>
   </footer>
  </article>
  
 </div>
 <footer>
  <p>Copyright © 2006 The Example Company</p>
  <p><a href="about.html">About</a> -
     <a href="policy.html">Privacy Policy</a> -
     <a href="contact.html">Contact Us</a></p>
 </footer>
</body> 
Обратите внимание, что элемент div используется для того, чтобы охватить весь контент страницы, который не является ни шапкой, ни подвалом.

В следующем примере содержится 2 элемента nav - первый это главная навигация по сайту, а второй это навигация по странице.
<body>
 <h1>The Wiki Center Of Exampland</h1>
 <nav>
  <ul>
   <li><a href="/">Home</a></li>
   <li><a href="/events">Current Events</a></li>
   ...more...
  </ul>
 </nav>
 <article>
  <header>
   <h1>Demos in Exampland</h1>
   <p>Written by A. N. Other.</p>
  </header>
  <nav>
   <ul>
    <li><a href="#public">Public demonstrations</a></li>
    <li><a href="#destroy">Demolitions</a></li>
    ...more...
   </ul>
  </nav>
  <div>
   <section id="public">
    <h1>Public demonstrations</h1>
    <p>...more...</p>
   </section>
   <section id="destroy">
    <h1>Demolitions</h1>
    <p>...more...</p>
   </section>
   ...more...
  </div>
  <footer>
   <p><a href="?edit">Edit</a> | <a href="?delete">Delete</a> | <a href="?Rename">Rename</a></p>
  </footer>
 </article>
 <footer>
  <p><small>© copyright 1998 Exampland Emperor</small></p>
 </footer>
</body>

среда, 14 апреля 2010 г.

HTML5. Элемент section

Сейчас вот впервые знакомлюсь с HTML5. Читаю спецификацию. На данный момент последняя версия вот такая. Особенно конечно обращаю внимание на новые элементы, которых не было в html4.01. Сегодня хочу представить свой перевод спецификации об элементе section.

Элемент section [^]
Категории которым принадлежит элемент:
Контексты, в которых данный элемент может быть использован:
Когда ожидается flow content.
Модель содержимого элемента:
Атрибуты:

Элемент section представляет общий документ или же секцию документа.Секция, в данном контексте, это тематическая группа содержимого, обычно с заголовком.
Примерами секций могут быть главы, различые страницы с закладками в диалоговых окнах с закладками, или пронумерованные секции заголовка. Домашняя страница сайта может быть разделена на секции для официальной части, новостей, контактной информации.
Примечание: Авторам можно использовать элемент article вместо section, это имеет смысл для объеденения элементов.
Примечание: Элемент section не является главным контейнером для других элементов. Если нужно для целей стилизации или удобства работы скрипта, разработчики могут использовать вместо элемента section элемент div. Общий случай, когда элемент section является наиболее подходящим, если контент элемента должен быть включен в список структуры документа.
В следующем примере, мы видим статью(которая является частью большой web-страницы) о яблоках, содержащую 2 секции.
<article>
 <hgroup>
  <h1>Apples</h1>
  <h2>Tasty, delicious fruit!</h2>
 </hgroup>
 <p>The apple is the pomaceous fruit of the apple tree.</p>
 <section>
  <h1>Red Delicious</h1>
  <p>These bright red apples are the most common found in many
  supermarkets.</p>
 </section>
 <section>
  <h1>Granny Smith</h1>
  <p>These juicy, green apples make a great filling for
  apple pies.</p>
 </section>
</article>
Обратите внимание, что использование элемента section означает, что разработчик может использовать элемент h1 везде, не переживая о том на каком уровне находится секция: на высшем, втором, третьем или другом.

Ниже представлена программа церемонии с двумя секциями, первая список выпускников, вторая с описанием церемонии.
<!DOCTYPE Html>
<Html>
  <Head>
    <Title>Graduation Ceremony Summer 2022</Title>
  </Head>
  <Body>
    <H1>Graduation</H1>
    <Section>
      <H1>Ceremony</H1>
      <P>Opening Procession</P>
      <P>Speech by Validactorian</P>
      <P>Speech by Class President</P>
      <P>Presentation of Diplomas</P>
      <P>Closing Speech by Headmaster</P>
   </Section>
   <Section>
     <H1>Graduates</H1>
       <Ul>
         <Li>Molly Carpenter</Li>
         <Li>Anastasia Luccio</Li>
         <LiEbenezar McCoy</Li>
         <Li>Karrin Murphy</Li>
         <Li>Thomas Raith</Li>
         <Li>Susan Rodriguez</Li>
       </Ul>
   </Section>
       </Body>
     </Html>

воскресенье, 24 января 2010 г.

Типы таблиц в MySQL и время выполнения запросов

Мне для проекта понадобилось создать одну таблицу, в которой будет около 160 000 записей, и среди них будет вестись поиск. Именно поиск, а не выборка.
Сначала я создала таблицу. А потом нужно было ее оптимизировать. Изначально тип был InnoDB. Но я знаю, что MyISAM таблицы быстрее. Но от шефа поступило задание поэкспериментировать с разными типами таблиц и индексов. Поэтому я придумала 6 запросов, которые будут на мой взгляд наиболее типичными и принялась за дело.
Поиск нужен будет по каким-либо из 3х полей: author(поле типа VARCHAR), name(VARCHAR), description(TEXT).
Вот с таким полями в разных комбинациях я и сделала запросы.
Ниже результат выполнения тестов приведенный в одну таблицу.
1- InnoDB без индексов
2 - MyISAM без индексов
3 - InnoDB, индекс на поле author
4 - MyISAM, индекс на author
5 - MyISAM, индекс на author и name
6 - MyISAM, индекс на author, name и полнотекстовый поиск по description.


 Выводы впринципе ожидаемые. Время выполнения запроса по таблице типа MyISAM заметно меньше.Добавление индексов еще немного уменьшает это время, но уже не так сильно. Полнотекстовый поиск не дает никаких преимуществ.
В результате был сделан выбор на пользу таблицы MyISAM с индексами на полях author, name.