1.插入数据
对于数据的插入,我们通常会只插入一条数据量,如下。
insert into student_course value (null,1,1);
但对于mysql中庞大的数据量时,推荐使用一条sql语句中插入多条数据,或者使用事务的开启,来进行批量插入多条数据。当然我们也可以使用mysql中load data local infile 来加载本地文件到数据库中去。
2.主键优化
我们知道,在mysql中,表中的数据是根据innodb引擎中B+tree索引实现的,如下:
对于索引,默认选择主键为聚集索引,其叶子节点是有顺序存放的,所以,在我们的sql语句中,主键的使用规范也对我们优化起到很重要。
顺序插入时,则依次插入数据,当本页的数据插满时,则会申请下一页的链接,使用到了双向指针。
若乱序插入时,则会出现页分裂的现象:更加的繁琐,复杂。
对于主键的设计,也应该遵循以下原则;
- 降低主键长度:比如在二级索引很多的情况下,其叶子节点在搜素时,就会在磁盘上占用大量的io资源。
- 不使用自然主键,去使用区分度高的主键:如UUID(乱序的)身份证虽然区分度高,但过长,也不推荐。
- 尽量不修改主键:因为对于业务来说,修改主键时,往往会涉及到其下的多个项目,这样就会使得修改主键的同时,又不得不修改其他东西。
3.order by 优化
对于sql的排序,其底层有两种方法:using index ;using filesort;
当我们没有创建索引时,使用order by进行分组查询时,就会默认使用using filesort 方法进行排序。
当我们创建了索引时(这里为tb_use表创建了sex索引),再来看看它的执行计划,发现现在是使用到了using index的索引方法
所以综上:对于使用order by 时,
- 尽量使用到创造了索引的排序方法。
- 尽量使用聚集索引,防止回表查询。
- order排序的升降序,需要和索引对应的升降序对于,否则索引也会失效。
4。group by 优化
gorup by 和order by相似,需要注意索引的使用条件。
5.count优化
在innodb引擎中,使用count计数时,需要把数据读出来进行一次一次累加进行计数的。
我们优化策略是:自己计数。
这里我们有count(主键),count(字段),count(1),count()四种方式
可以看出,当使用count()和count(1)计数时,innodb是不会将数据取出的,而count(主键)和count(字段)都会将数据取出,而字段,还有可能进行二级索引。不难看出,使用count时的效率:
count(*)>=count(1)>count(主键)>count(字段);
6.update优化
在表中没有创建索引时,使用update更新数据时,是针对整张表来更新的(表锁) 但对于创建索引的表来说,如果我们更新的是已创建索引的字段,则只会针对该字段的数据进行更新(行锁)。