Skip to content

Commit b88f705

Browse files
authored
Update 数据库-MySQL.md
1 parent 86e68a2 commit b88f705

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

MD/数据库-MySQL.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@ MyISAM相对简单所以在效率上要优于InnoDB。如果系统插入和查
2222
* 减少[子查询](http://www.cnblogs.com/zhengyun_ustc/p/slowquery3.html),使用Join替代
2323
* 不用NOT IN,因为会使用全表扫描而不是索引;不用IS NULL,NOT IS NULL,因为会使索引、索引统计和值更加复杂,并且需要额外一个字节的存储空间。
2424

25-
问:有个表特别大,字段是姓名、年龄、班级,如果调用`select * from table where name = xxx and age = xxx`该如何通过建立索引的方式优化查询速度?
26-
答:由于mysql查询每次只能使用一个索引,如果在name、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(name, age)的复合索引,那么其实相当于创建了(name, age)、(name)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。其次还要考虑该列的数据离散程度,如果有很多不同的值的话建议放在左边,name的离散程度也大于age。
27-
2825
问:max(xxx)如何用索引优化?
2926
答:在xxx列上建立索引,因为索引是B+树顺序排列的,锁在下次查询的时候就会使用索引来查询到最大的值是哪个
3027

3128
问:如何对分页进行优化?
3229
答:`SELECT * FROM big_table order by xx LIMIT 1000000,20`,这条语句会查询出1000020条的所有数据然后丢弃掉前1000000条,为了避免全表扫描的操作,在order by的列上加**索引**就能通过扫描索引来查询。但是这条语句会查询还是会扫描1000020条,还能改进成`select id from big_table where id >= 1000000 order by xx LIMIT 0,20`,用ID作为**过滤**条件将不需要查询的数据直接去除。
3330

31+
#### 最左前缀匹配原则
32+
在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。mysql会一直向右匹配直到遇到范围查询(>/</between/like)就停止匹配,比如a=3 and b=4 and c>5 and d=6,如果建立(a,b,c,d)联合索引,d就用不到索引,如果建立(a,b,d,c)则都能用到索引。
33+
34+
问:有个表特别大,字段是姓名、年龄、班级,如果调用`select * from table where name = xxx and age = xxx`该如何通过建立索引的方式优化查询速度?
35+
答:由于mysql查询每次只能使用一个索引,如果在name、age两列上创建联合索引的话将带来更高的效率。如果我们创建了(name, age)的联合索引,那么其实相当于创建了(name, age)、(name)三个索引,这是联合索引的特性,与联合索引的实现原理有关,也是最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。其次还要考虑该列的数据离散程度,如果有很多不同的值的话建议放在左边,name的离散程度也大于age。
36+
3437
## 事务隔离级别
3538
1. 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;
3639
2. 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作;

0 commit comments

Comments
 (0)