Skip to content

Commit 4e3760e

Browse files
authored
Update 数据库-MySQL.md
1 parent f584a48 commit 4e3760e

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

MD/数据库-MySQL.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ MyISAM相对简单所以在效率上要优于InnoDB。如果系统插入和查
1616
5. 水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;
1717

1818
### [SQL优化](https://www.imooc.com/video/3711)
19+
优化步骤:
20+
21+
1. 根据慢日志定位慢查询SQL
22+
2. 用explain分析SQL(type和extra字段分析)
23+
3. 修改SQL或加索引(如下)
1924

2025
* 对经常查询的列建立索引,但索引建多了当数据改变时修改索引会增大开销
2126
* 使用精确列名查询而不是*,特别是当数据量大的时候
@@ -56,10 +61,12 @@ select * from table_name inner join ( select id from table_name where (user = xx
5661
```
5762

5863
#### 最左前缀匹配原则
59-
在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。mysql会一直向右匹配直到遇到范围查询(>/</between/like)就停止后面的匹配,比如a=3 and b=4 and c>5 and d=6,如果建立(a,b,c,d)联合索引,d就用不到索引,如果建立(a,b,d,c)则都能用到索引。
64+
定义:在检索数据时从联合索引的最左边开始匹配。一直向右匹配直到遇到范围查询(>/</between/like)就停止后面的匹配
65+
66+
联合索引原理:联合索引是将第一个字段作为非叶子节点形成B+树结构的,在查询索引的时候先根据该字段一步步查询到具体的叶子节点,叶子节点上还会存在第二个字段甚至第三个字段的已排序结果。所以对于(a,b,c,d)这个联合索引会存在(a),(a,b),(a,b,c),(a,b,c,d)四个索引
6067

6168
问:有个表特别大,字段是姓名、年龄、班级,如果调用`select * from table where name = xxx and age = xxx`该如何通过建立索引的方式优化查询速度?
62-
答:由于mysql查询每次只能使用一个索引,如果在name、age两列上创建联合索引的话将带来更高的效率。如果我们创建了(name, age)的联合索引,那么其实相当于创建了(name, age)、(name)2个索引,这是联合索引的特性,与联合索引的实现原理有关,也是最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。其次还要考虑该列的数据离散程度,如果有很多不同的值的话建议放在左边,name的离散程度也大于age。
69+
答:由于mysql查询每次只能使用一个索引,如果在name、age两列上创建联合索引的话将带来更高的效率。如果我们创建了(name, age)的联合索引,那么其实相当于创建了(name, age)、(name)2个索引。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。其次还要考虑该列的数据离散程度,如果有很多不同的值的话建议放在左边,name的离散程度也大于age。
6370

6471
## 事务隔离级别
6572
1. 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;

0 commit comments

Comments
 (0)