首先简单介绍下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语句中的索引字段类型一定要和数据库表中的字段类型一致。同时索引字段的区分度一定要高。
2 分库分表分区
分库:可以安装业务分库,减少数据库并发访问下的压力,一般的做法是将查询库和系统库(增删改比较频繁)分开。
分表:当数据库鬼目过大例如千万和上亿级别的数据,这个时候使用索引的话可能光是索引文件就会非常大,这个时候分区就派上用场了。针对某一张大表,我们可以按照查询条件分成多张表,比如时间,我们将半个月的数据放在一张表里,以后每隔半个月自动新建一张表并将这半个月的数据放入,当然这样就没法支持索引,且当跨表查询时会union多张表。分表只针对大表,小表就没有必要了。
分区:分区的思想就是将相同规则或属性的数据放在一起,只要设定好相应的规则,当插入数据时,会自动将数据插入到对应的区域中,当查询时也能找到相应的区域,缺点就是分区不能扛住高并发访问而分区能。如何使用应该根据实际情况考虑。
3 数据库引擎
例如mysql常用的数据库引擎有两种一种是innodb,一种是myisam。其中innodb适合于增删改频繁的场景而myisam适合于查询频繁的场景。