|
1 | 1 | <!-- START doctoc generated TOC please keep comment here to allow auto update --> |
2 | 2 | <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> |
3 | 3 |
|
| 4 | + |
4 | 5 | - [事务的四大特性?](#%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%9B%9B%E5%A4%A7%E7%89%B9%E6%80%A7) |
5 | 6 | - [数据库的三大范式](#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%B8%89%E5%A4%A7%E8%8C%83%E5%BC%8F) |
6 | 7 | - [事务隔离级别有哪些?](#%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B) |
@@ -222,18 +223,18 @@ Index_comment: |
222 | 223 |
|
223 | 224 | ### 索引有什么分类? |
224 | 225 |
|
225 | | -1. 主键索引:名为primary的唯一非空索引,不允许有空值。 |
| 226 | +1、主键索引:名为primary的唯一非空索引,不允许有空值。 |
226 | 227 |
|
227 | | -2. 唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:UNIQUE 约束的列可以为null且可以存在多个null值。UNIQUE KEY的用途:唯一标识数据库表中的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下: |
| 228 | +2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:UNIQUE 约束的列可以为null且可以存在多个null值。UNIQUE KEY的用途:唯一标识数据库表中的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下: |
228 | 229 |
|
229 | | - ```mysql |
230 | | - ALTER TABLE table_name |
231 | | - ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...); |
232 | | - ``` |
| 230 | +```mysql |
| 231 | +ALTER TABLE table_name |
| 232 | +ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...); |
| 233 | +``` |
233 | 234 |
|
234 | | -3. 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀原则。 |
| 235 | +3、组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀原则。 |
235 | 236 |
|
236 | | -4. 全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。 |
| 237 | +4、全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。 |
237 | 238 |
|
238 | 239 | ### 什么是最左匹配原则? |
239 | 240 |
|
@@ -411,19 +412,19 @@ MVCC 的实现依赖于版本链,版本链是通过表的三个隐藏字段实 |
411 | 412 |
|
412 | 413 | 下面举个例子方便大家理解。 |
413 | 414 |
|
414 | | -1. 初始数据如下,其中DB_ROW_ID和DB_ROLL_PTR为空。 |
| 415 | +1、初始数据如下,其中DB_ROW_ID和DB_ROLL_PTR为空。 |
415 | 416 |
|
416 | | -  |
| 417 | + |
417 | 418 |
|
418 | | -2. 事务A对该行数据做了修改,将age修改为12,效果如下: |
| 419 | +2、事务A对该行数据做了修改,将age修改为12,效果如下: |
419 | 420 |
|
420 | | -  |
| 421 | + |
421 | 422 |
|
422 | | -3. 之后事务B也对该行记录做了修改,将age修改为8,效果如下: |
| 423 | +3、之后事务B也对该行记录做了修改,将age修改为8,效果如下: |
423 | 424 |
|
424 | | -  |
| 425 | + |
425 | 426 |
|
426 | | -4. 此时undo log有两行记录,并且通过回滚指针连在一起。 |
| 427 | +4、此时undo log有两行记录,并且通过回滚指针连在一起。 |
427 | 428 |
|
428 | 429 | **接下来了解下read view的概念。** |
429 | 430 |
|
@@ -464,27 +465,27 @@ MVCC 的实现依赖于版本链,版本链是通过表的三个隐藏字段实 |
464 | 465 |
|
465 | 466 | 下面举个例子说明下: |
466 | 467 |
|
467 | | -1. 首先,user表只有两条记录,具体如下: |
| 468 | +1、首先,user表只有两条记录,具体如下: |
468 | 469 |
|
469 | | -  |
| 470 | + |
470 | 471 |
|
471 | | -2. 事务a和事务b同时开启事务`start transaction`; |
| 472 | +2、事务a和事务b同时开启事务`start transaction`; |
472 | 473 |
|
473 | | -3. 事务a插入数据然后提交; |
| 474 | +3、事务a插入数据然后提交; |
474 | 475 |
|
475 | | - ```mysql |
476 | | - insert into user(user_name, user_password, user_mail, user_state) values('tyson', 'a', 'a', 0); |
477 | | - ``` |
| 476 | +```mysql |
| 477 | +insert into user(user_name, user_password, user_mail, user_state) values('tyson', 'a', 'a', 0); |
| 478 | +``` |
478 | 479 |
|
479 | | -4. 事务b执行全表的update; |
| 480 | +4、事务b执行全表的update; |
480 | 481 |
|
481 | | - ```mysql |
482 | | - update user set user_name = 'a'; |
483 | | - ``` |
| 482 | +```mysql |
| 483 | +update user set user_name = 'a'; |
| 484 | +``` |
484 | 485 |
|
485 | | -5. 事务b然后执行查询,查到了事务a中插入的数据。(下图左边是事务b,右边是事务a) |
| 486 | +5、事务b然后执行查询,查到了事务a中插入的数据。(下图左边是事务b,右边是事务a) |
486 | 487 |
|
487 | | -  |
| 488 | + |
488 | 489 |
|
489 | 490 | 以上就是当前读出现的幻读现象。 |
490 | 491 |
|
@@ -621,67 +622,71 @@ MySQL主要分为 Server 层和存储引擎层: |
621 | 622 |
|
622 | 623 | ## 分区表类型 |
623 | 624 |
|
624 | | -1. 按照范围分区。 |
625 | | - |
626 | | - ```mysql |
627 | | - CREATE TABLE test_range_partition( |
628 | | - id INT auto_increment, |
629 | | - createdate DATETIME, |
630 | | - primary key (id,createdate) |
631 | | - ) |
632 | | - PARTITION BY RANGE (TO_DAYS(createdate) ) ( |
633 | | - PARTITION p201801 VALUES LESS THAN ( TO_DAYS('20180201') ), |
634 | | - PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ), |
635 | | - PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ), |
636 | | - PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ), |
637 | | - PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ), |
638 | | - PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ), |
639 | | - PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ), |
640 | | - PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ), |
641 | | - PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ), |
642 | | - PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ), |
643 | | - PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ), |
644 | | - PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') ) |
645 | | - ); |
646 | | - ``` |
647 | | - |
648 | | - 在`/var/lib/mysql/data/`可以找到对应的数据文件,每个分区表都有一个使用#分隔命名的表文件: |
649 | | - |
650 | | - ``` |
651 | | - -rw-r----- 1 MySQL MySQL 65 Mar 14 21:47 db.opt |
652 | | - -rw-r----- 1 MySQL MySQL 8598 Mar 14 21:50 test_range_partition.frm |
653 | | - -rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201801.ibd |
654 | | - -rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201802.ibd |
655 | | - -rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201803.ibd |
656 | | - ... |
657 | | - ``` |
658 | | - |
659 | | -2. list分区。对于List分区,分区字段必须是已知的,如果插入的字段不在分区时枚举值中,将无法插入。 |
660 | | - |
661 | | - ```mysql |
662 | | - create table test_list_partiotion |
663 | | - ( |
664 | | - id int auto_increment, |
665 | | - data_type tinyint, |
666 | | - primary key(id,data_type) |
667 | | - )partition by list(data_type) |
668 | | - ( |
669 | | - partition p0 values in (0,1,2,3,4,5,6), |
670 | | - partition p1 values in (7,8,9,10,11,12), |
671 | | - partition p2 values in (13,14,15,16,17) |
672 | | - ); |
673 | | - ``` |
674 | | - |
675 | | -3. hash分区,可以将数据均匀地分布到预先定义的分区中。 |
676 | | - |
677 | | - ```mysql |
678 | | - create table test_hash_partiotion |
679 | | - ( |
680 | | - id int auto_increment, |
681 | | - create_date datetime, |
682 | | - primary key(id,create_date) |
683 | | - )partition by hash(year(create_date)) partitions 10; |
684 | | - ``` |
| 625 | +**按照范围分区。** |
| 626 | + |
| 627 | +```java |
| 628 | +CREATE TABLE test_range_partition( |
| 629 | + id INT auto_increment, |
| 630 | + createdate DATETIME, |
| 631 | + primary key (id,createdate) |
| 632 | + ) |
| 633 | + PARTITION BY RANGE (TO_DAYS(createdate) ) ( |
| 634 | + PARTITION p201801 VALUES LESS THAN ( TO_DAYS('20180201') ), |
| 635 | + PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ), |
| 636 | + PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ), |
| 637 | + PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ), |
| 638 | + PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ), |
| 639 | + PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ), |
| 640 | + PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ), |
| 641 | + PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ), |
| 642 | + PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ), |
| 643 | + PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ), |
| 644 | + PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ), |
| 645 | + PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') ) |
| 646 | + ); |
| 647 | +``` |
| 648 | + |
| 649 | +在`/var/lib/mysql/data/`可以找到对应的数据文件,每个分区表都有一个使用#分隔命名的表文件: |
| 650 | + |
| 651 | +```java |
| 652 | + -rw-r----- 1 MySQL MySQL 65 Mar 14 21:47 db.opt |
| 653 | + -rw-r----- 1 MySQL MySQL 8598 Mar 14 21:50 test_range_partition.frm |
| 654 | + -rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201801.ibd |
| 655 | + -rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201802.ibd |
| 656 | + -rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201803.ibd |
| 657 | +... |
| 658 | +``` |
| 659 | + |
| 660 | +**list分区** |
| 661 | + |
| 662 | +对于List分区,分区字段必须是已知的,如果插入的字段不在分区时枚举值中,将无法插入。 |
| 663 | + |
| 664 | +```java |
| 665 | +create table test_list_partiotion |
| 666 | + ( |
| 667 | + id int auto_increment, |
| 668 | + data_type tinyint, |
| 669 | + primary key(id,data_type) |
| 670 | + )partition by list(data_type) |
| 671 | + ( |
| 672 | + partition p0 values in (0,1,2,3,4,5,6), |
| 673 | + partition p1 values in (7,8,9,10,11,12), |
| 674 | + partition p2 values in (13,14,15,16,17) |
| 675 | + ); |
| 676 | +``` |
| 677 | + |
| 678 | +**hash分区** |
| 679 | + |
| 680 | +可以将数据均匀地分布到预先定义的分区中。 |
| 681 | + |
| 682 | +```java |
| 683 | +create table test_hash_partiotion |
| 684 | + ( |
| 685 | + id int auto_increment, |
| 686 | + create_date datetime, |
| 687 | + primary key(id,create_date) |
| 688 | + )partition by hash(year(create_date)) partitions 10; |
| 689 | +``` |
685 | 690 |
|
686 | 691 | ## 分区的问题? |
687 | 692 |
|
|
0 commit comments