kal*_*kin 12 mysql sql performance insert
我有以下InnoDB表:
+-----------+-----------+------+-----+-------------------+----------------+
| 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 | |
+-----------+-----------+------+-----+-------------------+----------------+
Run Code Online (Sandbox Code Playgroud)
使用这些键:
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| 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 | |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Run Code Online (Sandbox Code Playgroud)
我只是注意到in mysql-slow.log
我有时在这个表上有一个INSERT查询,这需要1秒多的时间
INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54')
Run Code Online (Sandbox Code Playgroud)
我真的很困惑为什么需要这么久.我怎样才能加快速度?
顺便说一句:每天都有大约80个缓慢的INSERTS和40个缓慢的更新.
Ric*_*iwi 12
有277259行,只有一些插入缓慢(罕见)
每当B-Tree页面已满时,需要将其拆分,这需要一些时间.由于每个插入更新所有索引,因此插入性能在您拥有的索引越多时也越慢.9000
已经正确地说明了你的(时间戳,员工)索引涵盖了95%的情况下的(时间戳)索引,在极少数情况下需要单列(时间戳)索引才能获得更好的性能.
还有一些定期的后台任务,有时可能会在一天内减慢一两个插件的速度.
此外,延迟的另一个原因是数据库活动.如果您有锁定页面的事务,插件需要更新(或页面拆分),则插入必须等到默认写入锁定.这些其他活动甚至不需要实际启动事务,它们甚至不必是读 - 读的争用; 您还可以具有写入写入争用或由繁重活动构建的队列.
最后一个可能的原因 - 您的数据库服务器资源不足,无论是内存还是CPU或网络i/o.服务器只能做很多事情,所以它必须等到它有足够的资源.
wup*_*tah 10
有时,查询本身不会导致速度减慢 - 在表上运行的另一个查询很容易导致插入因事务隔离和锁定而变慢.您的慢查询可能只是在等待另一个事务完成.这在繁忙的表上很常见,或者如果您的服务器正在执行长/复杂的事务.
另一个重要因素是数据库的整体性能:my.cnf
文件的调整方式,服务器本身的调整方式,服务器上运行的其他内容,当然还有服务器运行的硬件.
linux工具mytop
和查询SHOW ENGINE INNODB STATUS\G
可以帮助您查看可能的问题点.一般的linux性能工具还可以显示磁盘的繁忙程度等.
鉴于此表的性质,您是否考虑过另一种方法来跟踪谁在线?在MySQL中,我过去曾使用过MEMORY
表格.NoSQL数据存储也可能适用于此类信息.Redis可以将其存储为排序集,并取得很大成功(得分==时间戳).
进一步阅读:
如果您以大量密集的突发方式插入表,则可能需要一些时间进行内务处理,例如为表和索引分配更多空间。
如果不希望您的应用程序等待,请尝试使用INSERT DELAYED
它,尽管它确实有其缺点。