Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Полезные и вредные индексы MySQL

Полезные и вредные индексы MySQL

Рузин Алексей (КОКОС)

План доклада:

Как следует относиться к индексам
Теория индексов (B-tree)
Оптимизатор запросов MySQL
Рекомендации по созданию индексов
Конкретные примеры

Avatar for Moscow Python Meetup

Moscow Python Meetup

February 20, 2014
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Статистика Кокос • База данных - 300GB • 1,5 млрд

    записей • рост ~2,71828 раз в год ;-)
  2. Оптимизатор запросов MySQL • Смотрит сколько записей в таблице •

    Отбирает подходящие индексы • Смотрит на CARDINALITY индексов • Подсчитывает количество чтений блоков • Выбирает алгоритм с минимумом чтений
  3. EXPLAIN QUERY CREATE TABLE emp
 (id INT, name CHAR);
 


    CREATE INDEX ON emp(name); 
 EXPLAIN SELECT * FROM emp
 WHERE name=‘Рузин Алексей’ select_type: SIMPLE
 table: emp
 possible_keys: idx_emp_name, idx_emp_name_salary
 key: idx_emp_name
 rows: 1 (одна)
  4. Индексы вредные • Занимают место • Тратят время на перестроение

    при операциях (insert, update, delete) • «Убаюкивают» разработчиков
  5. Зачем тогда нужен индекс? • Ускорить решение ОДНОЙ задачи поиска

    (иногда нескольких) • Гарантировать уникальность (скрытая задача поиска)
  6. Как определять подходит индекс? • CREATE TABLE emp
 (id INT,

    first_name CHAR, salary INT, city CHAR); • CREATE INDEX ON emp(id) • CREATE INDEX ON emp(first_name) • CREATE INDEX ON emp(city, salary, first_name) • SELECT * FROM emp WHERE first_name=‘Иван’ • SELECT * FROM emp WHERE salary>100 • SELECT * FROM emp WHERE name=‘Иван’ AND salary>100 AND city=‘Москва’
  7. Запросы с поиском по двум и более полям • Используется

    только 1 индекс • Следует строить составной индекс при поиске по нескольким полям • В редких случаях MySQL может использовать пересечение двух одинарных индексов
  8. Рекомендации • Для мелких таблиц-справочников не делать индексы вообще •

    Понять какие запросы к таблице делаются чаще всего • Выбрать самые частые наборы полей • Расставить поля по убыванию CARDINALITY