I have the following InnoDB table:
+-----------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| doc_id | char(32) | NO | | NULL | |
| staff | char(18) | NO | | NULL | |
| timestamp | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+-----------+-----------+------+-----+-------------------+----------------+
With these keys:
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| staff_online | 0 | PRIMARY | 1 | id | A | 277350 | NULL | NULL | | BTREE | |
| staff_online | 1 | timestamp | 1 | timestamp | A | 277350 | NULL | NULL | | BTREE | |
| staff_online | 1 | staff_timestamp | 1 | timestamp | A | 277350 | NULL | NULL | | BTREE | |
| staff_online | 1 | staff_timestamp | 2 | staff | A | 277350 | NULL | NULL | | BTREE | |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
I just noticed that in mysql-slow.log
I sometimes have an INSERT query on this table which takes more than 1 second
INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54')
I'm really puzzled why it takes so long. How can I speed it up?
BTW: Each day there're ~80 slow INSERTS and 40 slow UPDATES like this.
Sometimes it is not the query itself which causes a slowdown - another query operating on the table can easily cause inserts to slow down due to transactional isolation and locking. Your slow queries might simply have been waiting for another transaction(s) to complete. This is fairly common on a busy table, or if your server is executing long/complex transactions.
Another significant factor will be the overall performance of your database: how your my.cnf
file is tuned, how the server itself is tuned, what else the server has running on it, and of course, what hardware the server is running.
The linux tool mytop
and the query SHOW ENGINE INNODB STATUS\G
can be helpful to see possible trouble spots. General linux performance tools can also show how busy your disks are, etc.
Given the nature of this table, have you considered an alternative way to keep track of who is online? In MySQL, I have used a MEMORY
table for such purposes in the past. A NoSQL data store might also be good for this type of information. Redis could store this as a sorted set with much success (score == timestamp).
Further reading:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With