Skip to content

Commit 534a948

Browse files
authored
Update 数据库-MySQL.md
1 parent f68013e commit 534a948

File tree

1 file changed

+4
-34
lines changed

1 file changed

+4
-34
lines changed

MD/数据库-MySQL.md

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -28,46 +28,16 @@ MyISAM相对简单所以在效率上要优于InnoDB。如果系统插入和查
2828
* 不用NOT IN,因为会使用全表扫描而不是索引;不用IS NULL,NOT IS NULL,因为会使索引、索引统计和值更加复杂,并且需要额外一个字节的存储空间。
2929

3030
问:max(xxx)如何用索引优化?
31-
答:在xxx列上建立索引,因为索引是B+树顺序排列的,锁在下次查询的时候就会使用索引来查询到最大的值是哪个
31+
答:在xxx列上建立索引,因为索引是B+树顺序排列的,在下次查询的时候就会使用索引来查询到最大的值是哪个
3232

33-
问:如何对分页进行优化?
34-
答:
35-
36-
```sql
37-
select * from table_name limit 10000,10
38-
```
39-
40-
这句 SQL 的执行逻辑是:
41-
42-
1. 从数据表中读取第N条数据添加到数据集中
43-
2. 重复第一步直到 N = 10000 + 10
44-
3. 根据 offset 抛弃前面 10000 条数
45-
4. 返回剩余的 10 条数据
46-
47-
数据库的数据存储是随机的,使用 B+Tree, Hash 等方式组织索引。所以当你让数据库读取第 10001 条数据的时候,数据库就只能一条一条的去查去数
48-
49-
最简单的方法是利用自增索引(假设为id):
50-
51-
```sql
52-
select * from table_name where (id >= 10000) limit 10
53-
```
54-
55-
但思路是有局限性的,首先必须要有自增索引列,而且数据在逻辑上必须是连续的,其次,你还必须知道特征值。如此苛刻的要求,在实际应用中是不可能满足的
56-
57-
好的方式是利用子查询把原来的基于user的搜索转化为基于主键(id)的搜索,主查询因为已经获得了准确的索引值,所以查询过程也相对较快:
58-
59-
```sql
60-
select * from table_name inner join ( select id from table_name where (user = xxx) limit 10000,10) b using (id)
61-
```
33+
问:有个表特别大,字段是姓名、年龄、班级,如果调用`select * from table where name = xxx and age = xxx`该如何通过建立索引的方式优化查询速度?
34+
答:由于mysql查询每次只能使用一个索引,如果在name、age两列上创建联合索引的话将带来更高的效率。如果我们创建了(name, age)的联合索引,那么其实相当于创建了(name, age)、(name)2个索引。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。其次还要考虑该列的数据离散程度,如果有很多不同的值的话建议放在左边,name的离散程度也大于age。
6235

6336
#### 最左前缀匹配原则
64-
定义:在检索数据时从联合索引的最左边开始匹配。一直向右匹配直到遇到范围查询(>/</between/like)就停止后面的匹配
37+
定义:在检索数据时从联合索引的最左边开始匹配。一直向右匹配直到遇到范围查询(>/</between/like)就停止后面的匹配。比如查询a = 3, b = 4 and c > 5 and d = 6,如果建立(a,b,c,d)索引,d是用不到索引的,如果建立(a,b,d,c)索引,则都可以用到,此外a,b,d的顺序可以任意调整
6538

6639
联合索引原理:联合索引是将第一个字段作为非叶子节点形成B+树结构的,在查询索引的时候先根据该字段一步步查询到具体的叶子节点,叶子节点上还会存在第二个字段甚至第三个字段的已排序结果。所以对于(a,b,c,d)这个联合索引会存在(a),(a,b),(a,b,c),(a,b,c,d)四个索引
6740

68-
问:有个表特别大,字段是姓名、年龄、班级,如果调用`select * from table where name = xxx and age = xxx`该如何通过建立索引的方式优化查询速度?
69-
答:由于mysql查询每次只能使用一个索引,如果在name、age两列上创建联合索引的话将带来更高的效率。如果我们创建了(name, age)的联合索引,那么其实相当于创建了(name, age)、(name)2个索引。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。其次还要考虑该列的数据离散程度,如果有很多不同的值的话建议放在左边,name的离散程度也大于age。
70-
7141
## 事务隔离级别
7242
1. 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;
7343
2. 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作;

0 commit comments

Comments
 (0)