Mysql性能优化-10.典型的SQL

1.DDL(Data Definition Language)执行

在线上服务器上,执行DDL,更新表的结构,这个操作,需要谨慎处理。
DDL,结构更改,会导致全表被独占锁定。如果是innodb还好些;此时表出于维护状态,不可操作状态。(5.6支持 Online DDL后效果显著提升,大大缩短锁定的时间)。
采用的维护表结构的DDL,是copy策略:
任务:增加一个列,增加一个索引:
思路:
创建一个新表,满足新的结构。
将旧表数据导入到新表中(读操作),逐条导入。保证一次性锁定的内容少,同时表上可以执行其他任务。
导入的过程中,记录表上的新更新操作。以日志的形式完成记录。
导入完毕后。将更新日志,在新表重做一遍。
新标曲替换旧表即可。在应用程序中完成,或者是数据库的rename,视图完成。

2.数据导入语句

在恢复数据时,需要大量的数据导入。需要一些技巧,保证快速导入:

导入时,先禁用索引和约束,导入完毕后,再开启索引和约束,一次性创建索引。

alter table table-name disable keys;
alter table table-name enable keys;

对于innodb,事务存储引擎,可以将多条SQL,放在一个事务中完成:

begin;
多条导入;
commit;

innodb是主键排序的,输入导入的数据本身就是按照主键排序,则导入速度相对较快。可以使用perpare,预编译的方案执行导入操作,减少相同结构的SQL编译次数。

3.大页码,limit offset,limit

尽量保证不要出现大的offset,在使用limit时。
limit 100000, 10;
思路是尽量使用条件过滤,完成数据筛选,而不是通过offset跳过已经查询到的数据。

4.select * 少用

尽量选择自己需要的字段。
问题不是很严重。
我们的框架的ORM模型,用的都是select *。

5.order by rand(),不要用

逻辑:随机排序

mysql> select * from t_student order by rand() limit 5;
+--------+------------+-----------+--------+-------+--------------------------------------+----------+
| id     | first_name | last_name | gender | user  | password                             | class_id |
+--------+------------+-----------+--------+-------+--------------------------------------+----------+
| 643727 | 2bc9f      | e6155     |      1 | 602-f | a4787d8d-cce8-4b1a-813e-6a67670b5eef |      353 |
| 583044 | 0077a      | 0b151     |      2 | 5b8-4 | b6a1f25e-962b-47ef-8d02-1017cc4f7433 |      240 |
| 648485 | 62b4d      | 82efc     |      2 | 68c-5 | ca06c084-2f77-4966-a315-b26853efea29 |      191 |
|  85567 | a2911      | 7ffe6     |      2 | a09-b | 71da7a3f-75f6-4c74-b2ac-7c1bff65d4e5 |      114 |
| 360811 | edd74      | 5e815     |      2 | 30b-d | e05b0fae-2e1f-4a7b-8141-a0774644e11b |      508 |
+--------+------------+-----------+--------+-------+--------------------------------------+----------+
5 rows in set (2.98 sec)

问题在于,生成了大量的随机数,每条记录都需要生成,仅仅需要5个记录。不必要的随机生成。

通常的思路:在应用程序中,将随机的主键生成好,去数据库中利用主键检索。
mt_rand(min,max)

6.单表对多表查询

单表:每次查询仅仅涉及到一张表
多表:子查询,join查询,查询时由多张表来完成;
尽量使用单表查询代替多表查询。原因性能问题,体现在以下几个方面
多表查询的执行:join,子查询,也是一个表的去执行。执行完,再去合并结果。
计算分布,单表查询,计算压力在应用程序端。多表查询,计算压力在数据库上。
多表查询,会增加表锁定时间。降低程序并发性能。
单表查询,增加了程序的复杂度。使用ORM模型,模型已经做了大量的工作完成单表处理。

7.count(*)问题

对应myisam没有问题,myisam会在表中自动存储总数据量。
对于innodb,没有内部的这个计数器。如果统计是一个常数工作。则需要自己来完成该统计:

将表中的记录数,额外记录下来:

id table(unique) count
1 t_student 700000
2 t_calss 1000

count(id),统计id字段不为null的数量
count(1),与count(*)类似。统计记录数量。

8.limit 1

如果可以确定仅仅检索一条,建议加上limit 1
框架的查询单条的操作,都会自动增加上limit 1;

猜你喜欢

转载自blog.csdn.net/weixin_34364071/article/details/90888495