对于这个表,我在小型InnoDB表上获得了非常慢的插入,每个大约40ms:
path('<slug:slug>/', MyView.as_view(), name='myview')
INSERT上的EXPLAIN给了我
CREATE TABLE IF NOT EXISTS events (
serial INT NOT NULL, -- client side serial number
time BIGINT NOT NULL, -- UNIX timestamp, client side, not server side
shard VARCHAR(255) NOT NULL, -- server shard
owner_name VARCHAR(255) NOT NULL, -- name of owner
object_name VARCHAR(255) NOT NULL, -- object name
region_name VARCHAR(255) NOT NULL, -- name of region
region_corner_x INT NOT NULL, -- corner of region
region_corner_Y INT NOT NULL, -- corner of region
local_position_x FLOAT NOT NULL, -- X and Y only
local_position_y FLOAT NOT NULL, -- X and Y only
tripid CHAR(40) NOT NULL, -- trip ID (random unique identifier)
severity TINYINT NOT NULL, -- an enum, really
eventtype VARCHAR(20) NOT NULL, -- STARTUP, SHUTDOWN, etc.
msg TEXT, -- human-readable message
auxval FLOAT NOT NULL, -- some other value associated with the event type
INDEX(tripid),
UNIQUE INDEX(tripid, serial), -- catch dups at insert time
INDEX(eventtype)
) ENGINE InnoDB;
我尝试删除索引。没有加速。从一张空桌子开始尝试。没有加速。这是在一个事务中,所以我将事务减少到这个插入。没有加速。
这是一个很小的测试案例。 200条记录。空表。空闲试验机。那个时间是一个INSERT。 200次插入大约需要10秒钟。 (插入必须单独完成;我在这里模拟传入的事件,而不是批量加载。)
现在,如果我切换到MyISAM,事情会加速大约200倍!
DB更新时间:108.224μs
整个测试的时间从10秒降至0.181秒。
我知道InnoDB速度较慢,但是200倍?
使用MySQL 5.7.21-0ubuntu0.16.04.1。 System是一个带有旋转硬盘的4 CPU Linux桌面。