Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:колони с ниска кардиналност/селективност =как се индексира?

Индексът, който описваш, е почти безсмислен. Индексът се използва най-добре, когато трябва да изберете малък брой редове в сравнение с общия брой редове.

Причината за това е свързана с начина, по който базата данни осъществява достъп до таблица. Таблиците могат да бъдат оценени или чрез пълно сканиране на таблицата, при което всеки блок се чете и обработва на свой ред. Или чрез търсене на rowid или ключ, където базата данни има ключ/rowid и чете точния ред, който изисква.

В случай, когато използвате клауза where въз основа на първичния ключ или друг уникален индекс, напр. where id = 1 , базата данни може да използва индекса, за да получи точна препратка към мястото, където се съхраняват данните на реда. Това е очевидно по-ефективно от извършването на пълно сканиране на таблицата и обработка на всеки блок.

Сега обратно към вашия пример, имате клауза where от where status = 'enabled' , индексът ще върне 150 милиона реда и базата данни ще трябва да чете всеки ред на свой ред, като използва отделни малки четения. Докато достъпът до таблицата с пълно сканиране на таблицата позволява на базата данни да използва по-ефективни по-големи четения.

Има момент, в който е по-добре просто да направите пълно сканиране на таблицата, вместо да използвате индекса. С mysql можете да използвате FORCE INDEX (idx_name) като част от вашата заявка, за да позволите сравнения между всеки метод за достъп до таблица.

Справка:http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в MySQL при задаване на стойност по подразбиране за DATE или DATETIME

  2. Как да изтриете рекурсивно елементи от таблицата?

  3. МЕЖДУ заявка, използваща JDBC с MySQL

  4. Защо Eclipse предлага Обект като тип на съпоставяне по подразбиране за тип данни Текст?

  5. две думи и празни интервали не работят в MYSQL заявка, използвайки LIKE