How to optimize COUNT(*) performance on InnoDB by using index

前端 未结 4 1893
说谎
说谎 2020-11-28 07:32

I have a largish but narrow InnoDB table with ~9m records. Doing count(*) or count(id) on the table is extremely slow (6+ seconds):



        
4条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-28 08:02

    As of MySQL 5.1.6 you can use the Event Scheduler and insert the count to a stats table regularly.

    First create a table to hold the count:

    CREATE TABLE stats (
    `key` varchar(50) NOT NULL PRIMARY KEY,
    `value` varchar(100) NOT NULL);
    

    Then create an event to update the table:

    CREATE EVENT update_stats
    ON SCHEDULE
      EVERY 5 MINUTE
    DO
      INSERT INTO stats (`key`, `value`)
      VALUES ('data_count', (select count(id) from data))
      ON DUPLICATE KEY UPDATE value=VALUES(value);
    

    It's not perfect but it offers a self contained solution (no cronjob or queue) that can be easily tailored to run as often as the required freshness of the count.

提交回复
热议问题