mysql dba系统学习(20)mysql存储引擎MyISAM

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

mysql存储引擎MyISAM

1,创建myisam表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> create table t (id  int  , name  var char( 30 ) , msg  var char( 100 )) engine = MyISAM;
mysql> show table status like  "t"  \G ;
***************************  1 . row ***************************
Name: t
Engine: MyISAM
Version:  10
Row_format: Dynamic
Rows:  0
Avg_row_length:  0
Data_length:  0
Max_data_length:  281474976710655
Index_length:  1024
Data_free:  0
Auto_increment: NULL
Create_time:  2013 - 09 - 12  00 : 39 : 29
Update_time:  2013 - 09 - 12  00 : 39 : 29
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1  row  in  set  ( 0.00  sec)


2,auto_increment

当使用这个参数的时候,这个列一定要是主键

1
2
3
4
5
6
7
8
9
10
11
12
mysql> create table tt ( id  int auto_increment primary key  , name varchar(30) , msg varchar(100)) engine = MyISAM;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt(name,msg) values( 'chenzhongyang' , 'good' );
Query OK, 1 row affected (0.00 sec)
虽然我们没有指定名字是chenzhongyang的 id 是1,但是有了auto_increment这个参数,系统会自动给他加上1
mysql>  select  * from tt;
+----+---------------+------+
id  | name          | msg  |
+----+---------------+------+
|  1 | chenzhongyang | good |
+----+---------------+------+
1 row  in  set  (0.01 sec)

我们还可以设置auto_increment的值,但是这个值设置了的话,就会从这个值开始累积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> alter table tt auto_increment= 2000 ;
Query OK,  1  row affected ( 0.02  sec)
Records:  1   Duplicates:  0   Warnings:  0
mysql> insert into tt(name,msg) values( 'tianhongyan' , 'baby' );
Query OK,  1  row affected ( 0.00  sec)
mysql> select * from tt;
+------+---------------+------+
| id   | name          | msg  |
+------+---------------+------+
|     1  | chenzhongyang | good |
2000  | tianhongyan   | baby |
+------+---------------+------+
2  rows  in  set  ( 0.00  sec)
mysql> insert into tt(name,msg) values( 'zhongguo' , 'XXXXXXX-YYYYYYYYY-+VVVV' );
Query OK,  1  row affected ( 0.00  sec)
mysql> select * FROM tt;
+------+---------------+-------------------------+
| id   | name          | msg                     |
+------+---------------+-------------------------+
|     1  | chenzhongyang | good                    |
2000  | tianhongyan   | baby                    |
2001  | zhongguo      | XXXXXXX-YYYYYYYYY-+VVVV |
+------+---------------+-------------------------+
3  rows  in  set  ( 0.00  sec)

还有一个函数比较有用last_insert_id()。这个函数可以查出最后一次insert的id

1
2
3
4
5
6
7
mysql> select  last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|              2001  |
+------------------+
1  row  in  set  ( 0.00  sec)


3,存储结构

数据文件(.MYD),索引文件(.MYI)和结构文件(.frm)

特点:可以在不同服务器上拷贝数据文件和索引文件。

如果我们把索引文件和数据文件放到不同的机器上,那么可以提高系统i/o


4,不支持事务

即使我们关闭autocommit,myisam引擎还是会立即执行我们的命令,这个时候rollback已经没有用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> show  var iables like  "%autocommit%" ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1  row  in  set  ( 0.00  sec)
mysql>  set  autocommit=OFF ;
Query OK,  0  rows affected ( 0.00  sec)
mysql> show  var iables like  "%autocommit%" ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1  row  in  set  ( 0.00  sec)
mysql>  delete  from tt where id= 1 ;
Query OK,  1  row affected ( 0.00  sec)
mysql> rollback;
Query OK,  0  rows affected,  1  warning ( 0.00  sec)
mysql> select   * from tt;
+------+-------------+-------------------------+
| id   | name        | msg                     |
+------+-------------+-------------------------+
2000  | tianhongyan | baby                    |
2001  | zhongguo    | XXXXXXX-YYYYYYYYY-+VVVV |
+------+-------------+-------------------------+
2  rows  in  set  ( 0.00  sec)


5,myisam_data_pointer_size

默认的指针大小是6byte,一个字节是8bit那么数据文件的大小就是2的6*8次方byte

也就是1024*1024*1024*1024*256/1024/1024/1024/1024=256TB

1
2
3
4
5
6
7
mysql> show  var iables like  "%pointer%" ;
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| myisam_data_pointer_size |  6      |
+--------------------------+-------+
1  row  in  set  ( 0.00  sec)

我们来做个实验试试

1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
如果myisam_data_pointer_size= 2 ,那么就意味着一个表的最大数据文件是 65535 / 1024 =64K
mysql>  set  global myisam_data_pointer_size= 2 ;
Query OK,  0  rows affected ( 0.00  sec)
mysql> show  var iables like  "%pointer%" ;
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| myisam_data_pointer_size |  2      |
+--------------------------+-------+
1  row  in  set  ( 0.00  sec)
我们来创建一个 大表ss
mysql> create table ss select * from information_schema.tables ;
Query OK,  54  rows affected ( 0.09  sec)
Records:  54   Duplicates:  0   Warnings:  0
mysql> insert into ss select * from ss;
Query OK,  108  rows affected ( 0.01  sec)
Records:  108   Duplicates:  0   Warnings:  0
mysql> insert into ss select * from ss;
Query OK,  216  rows affected ( 0.01  sec)
Records:  216   Duplicates:  0   Warnings:  0
这个时候出现了表ss满了的错误,我们看看数据文件 是64K,要想继续可以插入数据,那么就要把这个参数调大
mysql> insert into ss select * from ss;
ERROR  1114  (HY000): The table  'ss'  is  full
mysql> insert into ss select * from ss;
ERROR  1114  (HY000): The table  'ss'  is  full
mysql> insert into ss select * from ss;
ERROR  1114  (HY000): The table  'ss'  is  full
[root@test3 test]# ls -lh
total 116K
-rw-rw----.  1  mysql mysql  9 .3K Sep  12  06 : 44  ss.frm
-rw-rw----.  1  mysql mysql  64K Sep  12  06 : 44  ss.MYD
-rw-rw----.  1  mysql mysql  1 .0K Sep  12  06 : 44  ss.MYI
mysql> insert into ss select * from ss;
ERROR  1114  (HY000): The table  'ss'  is  full
mysql> alter table ss max_ROWS= 10000000000  ;
Query OK,  496  rows affected ( 0.11  sec)
Records:  496   Duplicates:  0   Warnings:  0
mysql> insert into ss select * from ss;
Query OK,  496  rows affected ( 0.02  sec)
Records:  496   Duplicates:  0   Warnings:  0


6,myisam的存储行格式

MyISAM支持三种不同存储格式。

其中两个(固定格式和动态格式)根据正使用的列的类型来自动选择。第三个,即已压缩格式,只能使用myisampack工具来创建。

1.fixed静态格式(固定长度)表的一般特征:

·CHAR列对列宽度是空间填补的。

·非常快。

·容易缓存。

·崩溃后容易重建,因为记录位于固定位置。

·重新组织是不必要的,除非你删除巨量的记录并且希望为操作系统腾出磁盘空间。为此,可使用OPTIMIZETABLE或者myisamchk-r

·通常比动态格式表需要更多的磁盘空间。

2.dynamic动态格式表的一般特征:

·除了长度少于4的列外,所有的字符串列是动态的。

·在每个记录前面是一个位图,该位图表明哪一列包含空字符串(对于字符串列)或者0(对于数字列)。注意,这并不包括包含NULL值的列。如果一个字符列在拖曳空间移除后长度为零,或者一个数字列为零值,这都在位图中标注了且列不被保存到磁盘。非空字符串被存为一个长度字节加字符串的内容。

·通常比固定长度表需要更少的磁盘空间。

·每个记录仅使用必需大小的空间。尽管如此,如果一个记录变大,它就按需要被分开成多片,造成记录碎片的后果。比如,你用扩展行长度的信息更新一行,该行就变得有碎片。在这种情况下,你可以时不时运行OPTIMIZETABLE或myisamchk-r来改善性能。可使用myisamchk-ei来获取表的统计数据。

·动态格式表在崩溃后要比静态格式表更难重建,因为一个记录可能被分为多个碎片且链接(碎片)可能被丢失。

3.已压缩表有下列特征:

·已压缩表占据非常小的磁盘空间。这最小化了磁盘用量,当使用缓慢的磁盘(如CD-ROM)之时,这是很有用的。

·每个记录是被单独压缩的,所以只有非常小的访问开支。依据表中最大的记录,一个记录的头在每个表中占据1到3个字节。每个列被不同地压缩。通常每个列有一个不同的Huffman树。一些压缩类型如下:

-后缀空间压缩。

-前缀空间压缩。

-零值的数用一个位来存储。

-如果在一个整型列中的值有一个小的范围,列被用最小可能的类型来存储。比如,一个BIGINT列(8字节),如果所有它的值在-128到127范围内,它可以被存储为TINYINT列(1字节)

-如果一个列仅有一小组可能的值,列的类型被转化成ENUM。

-一个列可以使用先前压缩类型的任意合并。

·可以处理固定长度或动态长度记录。

7,加锁和并发

MyISAM存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁的BDB存储引擎和支持行锁的InnoDB存储引擎(实际InnoDB是单独的一个公司,现在已经被Oracle公司收购)。但是MyISAM的表锁依然是使用最为广泛的锁类型

加锁:对整张表进行加锁,而不是行。
并发:在读数据的时候,所有的表上都可以获得共享锁(读锁),每个连接都不互相干扰。
在写数据的时候,获得排他锁,会把整个表进行加锁,而其他的连接请求(读,写请求)都处于等待中。

可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:

1
2
3
4
5
6
7
8
mysql> show status like  'table%' ;
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate |  2979  |
| Table_locks_waited |  0  |
+-----------------------+-------+
2  rows  in  set  ( 0.00  sec))

如果Table_locks_waited的值比较高,则说明存在着较严重的表级锁争用情况。

对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCKTABLE命令给MyISAM表显式加锁。显式加锁基本上都是为了方便而已,并非必须如此。也正是因为这样,所以myisam不会产生死锁。

READ锁表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
获得表film_text的READ锁定
mysql> lock table film_text read;
Query OK,  0  rows affected ( 0.00  sec)
当前session可以查询该表记录
mysql> select film_id,title from film_text where film_id =  1001 ;
+---------+------------------+
| film_id | title            |
+---------+------------------+
1001      | ACADEMY DINOSAUR |
+---------+------------------+
1  row  in  set  ( 0.00  sec)
其他session也可以查询该表的记录
mysql> select film_id,title from film_text where film_id =  1001 ;
+---------+------------------+
| film_id | title            |
+---------+------------------+
1001     | ACADEMY DINOSAUR |
+---------+------------------+
1  row  in  set  ( 0.00  sec)
当前session不能查询没有锁定的表
mysql> select film_id,title from film where film_id =  1001 ;
ERROR  1100  (HY000): Table  'film'  was not locked  with  LOCK TABLES
其他session可以查询或者更新未锁定的表
mysql> select film_id,title from film where film_id =  1001 ;
+---------+---------------+
| film_id | title         |
+---------+---------------+
1001     | update record |
+---------+---------------+
1  row  in  set  ( 0.00  sec)
mysql> update film  set  title =  'Test'  where film_id =  1001 ;
Query OK,  1  row affected ( 0.04  sec)
Rows matched:  1  Changed:  1  Warnings:  0
当前session中插入或者更新锁定的表都会提示错误:
mysql> insert into film_text (film_id,title) values( 1002 , 'Test' );
ERROR  1099  (HY000): Table  'film_text'  was locked  with  a READ lock and can't be updated
mysql> update film_text  set  title =  'Test'  where film_id =  1001 ;
ERROR  1099  (HY000): Table  'film_text'  was locked  with  a READ lock and can't be updated
其他session更新锁定表会等待获得锁:
mysql> update film_text  set  title =  'Test'  where film_id =  1001 ;
等待
释放锁
mysql> unlock tables;
Query OK,  0  rows affected ( 0.00  sec)
等待
Session获得锁,更新操作完成:
mysql> update film_text  set  title =  'Test'  where film_id =  1001 ;
Query OK,  1  row affected ( 1  min  0.71  sec)
Rows matched:  1  Changed:  1  Warnings:  0
当使用LOCK TABLES时,不仅需要一次锁定用到的所有表,而且,同一个表在SQL语句中出现多少次,就要通过与SQL语句中相同的别名锁定多少次,否则也会出错!举例说明如下。
1 )对actor表获得读锁:
mysql> lock table actor read;
Query OK,  0  rows affected ( 0.00  sec)
2 )但是通过别名访问会提示错误:
mysql> select a.first_name,a.last_name,b.first_name,b.last_name from actor a,actor b where a.first_name = b.first_name and a.first_name =  'Lisa'  and a.last_name =  'Tom'  and a.last_name <> b.last_name;
ERROR  1100  (HY000): Table  'a'  was not locked  with  LOCK TABLES
3 )需要对别名分别锁定:
mysql> lock table actor  as  a read,actor  as  b read;
Query OK,  0  rows affected ( 0.00  sec)
4 )按照别名的查询可以正确执行:
mysql> select a.first_name,a.last_name,b.first_name,b.last_name from actor a,actor b where a.first_name = b.first_name and a.first_name =  'Lisa'  and a.last_name =  'Tom'  and a.last_name <> b.last_name;
+------------+-----------+------------+-----------+
| first_name | last_name | first_name | last_name |
+------------+-----------+------------+-----------+
| Lisa       | Tom       | LISA       | MONROE    |
+------------+-----------+------------+-----------+
1  row  in  set  ( 0.00  sec)

WRITE锁表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
获得表film_text的WRITE锁定
mysql> lock table film_text write;
Query OK,  0  rows affected ( 0.00  sec)
当前session对锁定表的查询、更新、插入操作都可以执行:
mysql> select film_id,title from film_text where film_id =  1001 ;
+---------+-------------+
| film_id | title |
+---------+-------------+
1001  | Update Test |
+---------+-------------+
1  row  in  set  ( 0.00  sec)
mysql> insert into film_text (film_id,title) values( 1003 , 'Test' );
Query OK,  1  row affected ( 0.00  sec)
mysql> update film_text  set  title =  'Test'  where film_id =  1001 ;
Query OK,  1  row affected ( 0.00  sec)
Rows matched:  1  Changed:  1  Warnings:  0
其他session对锁定表的查询被阻塞,需要等待锁被释放:
mysql> select film_id,title from film_text where film_id =  1001 ;
等待
释放锁:

并发插入(ConcurrentInserts)

上文提到过MyISAM表的读和写是串行的,但这是就总体而言的。在一定条件下,MyISAM表也支持查询和插入操作的并发进行。

MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。

l当concurrent_insert设置为0时,不允许并发插入。

l当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。

l当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。

在如表20-4所示的例子中,session_1获得了一个表的READLOCAL锁,该线程可以对表进行查询操作,但不能对表进行更新操作;其他的线程(session_2),虽然不能对表进行删除和更新操作,但却可以对该表进行并发插入操作,这里假设该表中间不存在空洞。

表20-4MyISAM存储引擎的读写(INSERT)并发例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
session_1
session_2
获得表film_text的READ LOCAL锁定
mysql> lock table film_text read local;
Query OK,  0  rows affected ( 0.00  sec)
当前session不能对锁定表进行更新或者插入操作:
mysql> insert into film_text (film_id,title) values( 1002 , 'Test' );
ERROR  1099  (HY000): Table  'film_text'  was locked  with  a READ lock and can't be updated
mysql> update film_text  set  title =  'Test'  where film_id =  1001 ;
ERROR  1099  (HY000): Table  'film_text'  was locked  with  a READ lock and can't be updated
其他session可以进行插入操作,但是更新会等待:
mysql> insert into film_text (film_id,title) values( 1002 , 'Test' );
Query OK,  1  row affected ( 0.00  sec)
mysql> update film_text  set  title =  'Update Test'  where film_id =  1001 ;
等待
当前session不能访问其他session插入的记录:
mysql> select film_id,title from film_text where film_id =  1002 ;
Empty  set  ( 0.00  sec)
释放锁:
mysql> unlock tables;
Query OK,  0  rows affected ( 0.00  sec)
等待
当前session解锁后可以获得其他session插入的记录:
mysql> select film_id,title from film_text where film_id =  1002 ;
+---------+-------+
| film_id | title |
+---------+-------+
1002  | Test |
+---------+-------+
1  row  in  set  ( 0.00  sec)
Session2获得锁,更新操作完成:
mysql> update film_text  set  title =  'Update Test'  where film_id =  1001 ;
Query OK,  1  row affected ( 1  min  17.75  sec)
Rows matched:  1  Changed:  1  Warnings:  0

可以利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入的锁争用。例如,将concurrent_insert系统变量设为2,总是允许并发插入;同时,通过定期在系统空闲时段执行OPTIMIZETABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞

MyISAM的锁调度

MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM的调度行为。

通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

通过执行命令SETLOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。

通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。

虽然上面3种方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。

另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。

上面已经讨论了写优先调度机制带来的问题和解决办法。这里还要强调一点:一些需要长时间运行的查询操作,也会使写进程“饿死”!因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“分解”,使每一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行。



本文转自陈仲阳0 51CTO博客,原文链接:http://blog.51cto.com/wolfword/1295168

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
2天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
6天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
45 7
|
15天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
78 7
|
22天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
51 9
|
1月前
|
存储 缓存 关系型数据库
【赵渝强老师】MySQL的MyISAM存储引擎
在MySQL5.1版本之前,默认存储引擎为MyISAM。MyISAM管理非事务表,提供高速存储和检索,支持全文搜索。其特点包括不支持事务、表级锁定、读写互阻、仅缓存索引等。适用于读多、写少且对一致性要求不高的场景。示例代码展示了MyISAM存储引擎的基本操作。
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
19 3
|
3天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
22 2