Запрос огромной таблицы в MySQL - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть таблица, которая имеет около 1 миллиона строк (размер на физическом диске составляет почти 8 ГБ, поскольку в ней есть текстовый столбец), что занимает много времени для любой транзакции.В частности, для «выбора» требуется огромное время, например, для запроса подсчета без каких-либо условий, например, около 20 минут, например, select count(*) from TestPerformance.

Схема таблицы:

Имя: TestPerformance

Field       Type    Null    Key     Default     Extra

ID      int(11)     NO  PRI     null    
TEXT        text        YES         null    
CATEGORY    varchar(100)    YES     MUL     null    
DDOMAIN     varchar(100)    YES         null    
NETWORK     varchar(100)    YES         null    
NODE        varchar(100)    YES         null    
ENTITY      varchar(100)    YES     MUL     null    
SEVERITY    int(11)     YES         null    
TTIME       bigint(20)  YES         null    
SOURCE      varchar(255)    NO  MUL     null    
HELPURL     varchar(100)    YES         null    
WEBNMS      varchar(100)    YES         null    
GROUPNAME   varchar(100)    YES         null    
OWNERNAME   varchar(25)     NO  PRI     null      

и индексы

Table           Non_unique  Key_name        Seq_in_index    Column_name     
TestPerformance     0       PRIMARY         1       ID      
TestPerformance     0       PRIMARY         2       OWNERNAME   
TestPerformance     1       TestPerformance0_ndx    1       ID      
TestPerformance     1       TestPerformance1_ndx    1       OWNERNAME   
TestPerformance     1       TestPerformance_ndx     1       CATEGORY    
TestPerformance     1       TestPerformance_ndx     2       SOURCE      
TestPerformance     1       TestPerformance_ndx1    1       ENTITY      
TestPerformance     1       TestPerformance_ndx2    1       SOURCE  

Я настроил размер key_buffer на 1 ГБ, но производительность ничего не изменила.

Как ускорить транзакцию этой таблицыбез удаления каких-либо данных?

Я не эксперт БД.Просьба представить ваши предложения по улучшению производительности таблицы.

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Как я могу ускорить транзакцию этой таблицы без удаления каких-либо данных?

1 миллион строк - это не много данных. 8 ГБ - это значительный объем данных.

Переместить столбец типа текста в отдельную таблицу (с соотношением 1: 1). Уменьшите размер этих таблиц varchar до минимального размера, необходимого для хранения данных (или рассмотрите возможность перемещения любых, которые вам не нужны для фильтрации, в другую таблицу).

Действительно ли вам нужен идентификатор и имя владельца для первичного ключа? Я подозреваю, что идентификатор может быть уникальным. Если это так, потерять TestPerformance0_ndx - это избыточно. Действительно, вам следует приступить к анализу ваших журналов и посмотреть, какие индексы СУБД действительно необходима для обслуживания запросов и соответственно изменить схему

1 голос
/ 05 декабря 2011

Запустите EXPLAIN по вашему запросу (который вы должны опубликовать для нас, чтобы увидеть). Это поможет определить, какие индексы пытается использовать ваш запрос и какие столбцы используют полное сканирование таблицы.

Кроме того, не выбирайте count *, вместо этого посчитайте ваш основной recid, чтобы он мог просто сосчитать, используя ваш индекс.

...