LINUX.ORG.RU

MySQL. Распределение данных в столбце по индексу

 , ,


0

2

Коллеги, DBA. Как узнать распределение значений в столбце согласно индексу?

Дана таблица. Выполняемый запрос: DELETE FROM history_uint WHERE (clock < '1602720000');

Немного о таблице/столбце:

Cardinality (SHOW INDEXES) ~1.5M уникальных значений
TABLE_ROWS (information_schema) ~1.8М строк всего
Data_length (TABLE STATUS) ~108 Гб данных
Index_length (TABLE STATUS) ~55 Гб размер индекса

При выполнении запроса на очистку мускуль принимает решение не использовать индекс.

EXPLAIN:

mysql> EXPLAIN DELETE FROM history_uint WHERE (clock < '1602720000')\G;
*************************** 1. row ***************************
           id: 1
  select_type: DELETE
        table: history_uint
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1812010879
     filtered: 100.00
        Extra: Using where

(В принципе, логично, т.к. я ожидаю, что очистится примерно 70% +/- всей таблицы)

Я хочу перестроить индекс (после того как таблица будет почищена - я не тороплюсь).

Но! Чтобы принять решение о будущем типе индекса и его структуре мне нужно знать текущее распределение данных в разрезе индекса. Как его получить?

P.S. Я понимаю, что можно сделать мегаселект и сгруппировать, но есть ли способ прочитать именно данные об индексе - без самих данных.

P.S.S. Данные таблицы:


mysql> SHOW TABLE STATUS WHERE `Name` = "history_uint"\G;
*************************** 1. row ***************************
           Name: history_uint
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 1812010879
 Avg_row_length: 64
    Data_length: 116546568192
Max_data_length: 0
   Index_length: 59159265280
      Data_free: 6291456
 Auto_increment: NULL
...
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
...


Для того чтобы оставить комментарий войдите или зарегистрируйтесь.