数据库优化思路

首先简单介绍下sql的执行流程

当在客户端或者navivat提交一条sql语句的时候,sql解析引擎会启动,sql引擎会自动执行sql优化

创建一张student表

create table student(
    id int not null auto_increment,primary key(id),
    name varchar(66),
    age int,
    hobby varchar(100));

向表中插入数据如下

+----+-----------+------+-------+
| id | name      | age  | hobby |
+----+-----------+------+-------+
|  1 | xiaoming  |   20 | lol   |
|  2 | xiaozhang |   20 | dnf   |
|  3 | xiaoliu   |   20 | cf    |
|  4 | xiaowang  |   20 | wow   |
|  5 | xiaozhou  |   20 | 555   |
+----+-----------+------+-------+

 当执行如下sql语句时

mysql> select * from student where hobby=555;
+----+----------+------+-------+
| id | name     | age  | hobby |
+----+----------+------+-------+
|  5 | xiaozhou |   20 | 555   |
+----+----------+------+-------+
1 row in set, 4 warnings (0.07 sec)

 我们在sql语句中使用了555 int类型也查询到了数据库中varchar类型的555的记录,原因就是sql引擎的自动优化。

    接下来向数据库中添加索引(约束)

alter table student
add index(name);

alter table student
add index(age);

alter table student
add unique(hobby);

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(66)  | YES  | MUL | NULL    |                |
| age   | int(11)      | YES  | MUL | NULL    |                |
| hobby | varchar(100) | YES  | UNI | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

当数据库表定义了多个索引,你写的sql可能都会命中,但sql引擎会帮你选择一个最优的索引。

以上就是sql的执行过程。

下面开始介绍sql的常见优化方式

1 索引,索引是最常见的也是成本最低的数据库优化方式,当查询带索引的字段时查询速度会大大增加,一般在数据库规模在几十万和几百万的时候见效最快。注意sql语句中的索引字段类型一定要和数据库表中的字段类型一致。同时索引字段的区分度一定要高。

扫描二维码关注公众号,回复: 3528640 查看本文章

2 分库分表分区

分库:可以安装业务分库,减少数据库并发访问下的压力,一般的做法是将查询库和系统库(增删改比较频繁)分开。

分表:当数据库鬼目过大例如千万和上亿级别的数据,这个时候使用索引的话可能光是索引文件就会非常大,这个时候分区就派上用场了。针对某一张大表,我们可以按照查询条件分成多张表,比如时间,我们将半个月的数据放在一张表里,以后每隔半个月自动新建一张表并将这半个月的数据放入,当然这样就没法支持索引,且当跨表查询时会union多张表。分表只针对大表,小表就没有必要了。

分区:分区的思想就是将相同规则或属性的数据放在一起,只要设定好相应的规则,当插入数据时,会自动将数据插入到对应的区域中,当查询时也能找到相应的区域,缺点就是分区不能扛住高并发访问而分区能。如何使用应该根据实际情况考虑。

3 数据库引擎

例如mysql常用的数据库引擎有两种一种是innodb,一种是myisam。其中innodb适合于增删改频繁的场景而myisam适合于查询频繁的场景。

猜你喜欢

转载自blog.csdn.net/qq_37566910/article/details/82966485
今日推荐