Mysql improve SELECT speed

后端 未结 8 942
借酒劲吻你
借酒劲吻你 2021-01-02 05:24

I\'m currently trying to improve the speed of SELECTS for a MySQL table and would appreciate any suggestions on ways to improve it.

We have over 300 million records

8条回答
  •  醉酒成梦
    2021-01-02 06:06

    take time to read my answer here: (has similar volumes to yours)

    500 millions rows, 15 million row range scan in 0.02 seconds.

    MySQL and NoSQL: Help me to choose the right one

    then amend your table engine to innodb as follows:

    create table tag_date_value
    (
    tag_id smallint unsigned not null, -- i prefer ints to chars
    tag_date datetime not null, -- can we make this date vs datetime ?
    value int unsigned not null default 0, -- or whatever datatype you require
    primary key (tag_id, tag_date) -- clustered composite PK
    )
    engine=innodb;
    

    you might consider the following as the primary key instead:

    primary key (tag_id, tag_date, value) -- added value save some I/O
    

    but only if value isnt some LARGE varchar type !

    query as before:

    select
     tag_date, 
     value
    from
     tag_date_value
    where
     tag_id = 1 and
     tag_date between 'x' and 'y'
    order by
     tag_date;
    

    hope this helps :)

    EDIT

    oh forgot to mention - dont use alter table to change engine type from mysiam to innodb but rather dump the data out into csv files and re-import into a newly created and empty innodb table.

    note i'm ordering the data during the export process - clustered indexes are the KEY !

    Export

    select * into outfile 'tag_dat_value_001.dat' 
    fields terminated by '|' optionally enclosed by '"'
    lines terminated by '\r\n'
    from
     tag_date_value
    where
     tag_id between 1 and 50
    order by
     tag_id, tag_date;
    
    select * into outfile 'tag_dat_value_002.dat' 
    fields terminated by '|' optionally enclosed by '"'
    lines terminated by '\r\n'
    from
     tag_date_value
    where
     tag_id between 51 and 100
    order by
     tag_id, tag_date;
    
    -- etc...
    

    Import

    import back into the table in correct order !

    start transaction;
    
    load data infile 'tag_dat_value_001.dat' 
    into table tag_date_value
    fields terminated by '|' optionally enclosed by '"'
    lines terminated by '\r\n'
    (
    tag_id,
    tag_date,
    value
    );
    
    commit;
    
    -- etc...
    

提交回复
热议问题