- 插入数据
批量插入:因为一条条插入时,每一条数据的插入都要与数据库建立连接,并且关闭连接
手动提交事物:
主键顺序插入
- 大批量数据插入
如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下·
- 客户端连接服务端时,加上参数 --local-infile
mysql --local-infile -u root -p
- 设置全局参数 local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
- 执行local指令,将准备好的数据加载到表结构中
local data local infile ‘/xx/yy/sql.log’ into table 表名 fields terminated by ‘,’ lines terminated by ‘\n’;
- 主键优化
主键设计原则:
- 满足业务需求的情况下,尽量降低主键的长度
二级索引下,二级索引的也字节点中挂的是主键,如果主键较长,二级索引比较多,
将会占用大量的磁盘空间,在搜索时将会耗费大量的磁盘IO
- 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键
顺序插入时,当一个page写完后才会写另一个page,而乱序插入可能会引起页分裂现象
最后变成:
- 尽量不要使用UUID作为做主键或者其他自然主键,如身份证号
主键较长,二级索引比较多,将会占用大量的磁盘空间,在搜索时将会耗费大量的 磁盘IO
- 业务操作时,避免对主键的修改
- order by优化
排序字段加上索引
两个排序字段,一正一倒呢?
所以我们优化时就是尽可能将using filesort给优化点
可以通过创建索引来解决
优化后的结果为:
排序字段不加索引:
总结:
4、group by优化
主要是针对索引进行优化。验证下加索引与不加索引时 分组的效率
加上索引后,效率会得到提升
关于索引的使用
5、limit优化
需要时间较久,如果有1000万条数据,时间大概会在10s级别
可以通过覆盖索引+子查询的方式优化
6、count优化
count的用法:
用法截图如下:
效率:
7、update优化
行锁还是表锁
两个事物,当都修改id(有索引)对应的信息时
update course set name = ‘kafka’ where id=4
update course set name = ‘java’ where id=1
两个事物的修改操作都能成功,因为此时锁的是行级锁
两个事物,当都修改name(无索引)对应的信息时
update course set name = ‘kafka’ where name=’java’
update course set name = ‘java’ where name=’mysql’
第一个事物回马上修改成功,但是第二个事物的修改会等第一个事物提交后才能修改成功,因为name没有索引,此时锁的是表级锁
为name加上索引后,两个事物都修改name对应的信息时
两个事物的修改操作都能成功,因为此时锁的是行级锁