MySQL优化点
1. 基于访问类型优化
在前文中我们已经详细介绍了EXPLAIN语句中的访问类型(type),如果一个查询的访问类型并不是我们预期的,那么最简单直接的解决办法是为搜索条件列 增加合适的索引。
2. 减少扫描行数的优化
在有些情况下,简单地增加索引并不能解决问题,,比如执行如下 SQL:
sql
select name, count(name) from specific_table group by key1;
这条SQL执行完毕后可能只返回几行数据,但是因为有COUNT聚合函数,需要扫描的数据可能会有成千上万行,这取决于表中数据量总数。对于这种 扫描大量数据却只返回少数行的情况,通常可以通过 增加单独的汇总表 进行优化,当然这需要在应用层增加相应的逻辑对汇总表的数据进行维护。
3. 切分处理
4. 优化联结查询
阿里巴巴开发手册中提到过一点,联表查询时联表的数量不超过 3 个。如果联表过多,我们需要将其拆成多个查询或多个单表查询(单表查询的 缓存效率会更高),查询被分解后,查询间的锁竞争会减少。除此之外,联表查询还需要注意以下两点:
确保ON或者USING子句中的列上有索引。
确保任何GROUP BY和ORDER BY中的表达式只涉及一个表中的列,这样 MySQL 才有可能使用索引来优化这个查询
5.
1. 插入数据
1.1 批量插入
sql
insert into tb_test values(1,'Tom'),(2,'cat'),(3, 'Jerry');
1.2 手动提交事务
sql
start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3, 'jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6, 'jerry');
insert into tb_test values(7,'Tom'),(8,'cat'),(9, 'jerry');
commit;
1.3 主键顺序插入
sql
主键乱序插入:8 1 9 21 88 2 4 15 89 5 7 3
主键顺序插入:1 2 3 4 5 6 7 8 9 15 21 88 89
1.4 大批量插入数据
如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下:
sh
#客户端连接服务端时,加上参数--local-infile
mysal--local-infile -u root -p
#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
#执行load指令将准备好的数据,加载到表结构中, 其中sql1.log是csv格式
load data local infile '/root/sql1.log' into table tb user` fields terminated by ',' lines terminated by '\n';
2. 主键优化
3. update优化
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。