>  기사  >  데이터 베이스  >  MySQL을 배우기 위해 알아야 할 28가지 팁

MySQL을 배우기 위해 알아야 할 28가지 팁

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-16 17:14:561556검색

정보 기술의 지속적인 발전과 인터넷 산업의 급속한 성장으로 인해 MySQL은 오픈 소스 데이터베이스로서 널리 사용되고 개발되었습니다. 현재 MySQL은 관계형 데이터베이스 분야에서 매우 중요한 구성원이 되었습니다.

운영, 유지, 개발, 테스트, 아키텍트 등 데이터베이스 기술은 연봉 인상을 위한 필수 도구이므로 항상 데이터베이스와 MySQL을 배워야 한다고 합니다. 모직물에 대해 알아요?

MySQL을 빨리 익히는 방법은?

관심을 키우세요

어떤 지식을 배우든 관심은 학습 효율성을 크게 향상시킬 수 있습니다. 공부해도MySQL5.7 还是 MySQL8.0 예외는 없습니다!

SQL의 기초를 튼튼히 하세요

컴퓨터 분야의 기술은 기초에 중점을 두기 때문에 처음 학습할 때는 이를 깨닫지 못할 수도 있습니다. 기술 응용이 심화됨에 따라 탄탄한 기본 능력을 갖춘 사람만이 기술의 길에서 더 빠르고 멀리 갈 수 있습니다. MySQL을 배우기 위해서는 SQL 문이 가장 기본적인 부분이며, 많은 연산이 SQL 문을 통해 구현됩니다. 따라서 학습 과정에서 독자는 더 많은 SQL 문을 작성하고 다른 구현 문을 사용하여 동일한 기능을 완성함으로써 차이점을 깊이 이해해야 합니다.

시간에 맞춰 새로운 지식을 배우세요

검색 엔진을 정확하고 효과적으로 사용하여 MySQL에 관한 많은 관련 지식을 검색하세요. 동시에 문제 해결을 위해 다른 사람의 아이디어를 참조하고, 다른 사람의 경험을 통해 배우고, 적시에 최신 기술 정보를 얻을 수 있습니다.

다양한 실제 작업

데이터베이스 시스템은 작동성이 매우 뛰어나며 많은 실제 컴퓨터 작업이 필요합니다. 실제 운영 과정에서만 문제를 발견하고 이를 해결하기 위한 방법과 아이디어를 생각해 볼 수 있어야 실제 운영 능력이 향상될 수 있습니다.

MySQL 학습 시 꼭 알아야 할 28가지 팁을 소개합니다!

1. MySQL에서 특수 문자를 사용하는 방법은 무엇입니까?

작은따옴표 등' , 큰따옴표", 백슬래시 및 기타 기호는 이러한 기호를 직접 사용할 수 없습니다. MySQL을 입력하고 사용하세요. 그렇지 않으면 예상치 못한 결과가 발생합니다. ',双引号 ",反斜线 等符号,这些符号在 MySQL 中不能直接输入使用,否则会产生意料之外的结果。

举例:

假设 Lucifer 表中需要存入一行记录,值为 lucifer's dog,其中的单引号 '

🎜예: 🎜🎜🎜lucifer's dog, 작은따옴표' 숫자, 이스케이프하지 않으면 성공적으로 실행할 수 없습니다: 🎜
mysql> create table lucifer (id int,name char(100));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into lucifer values (1,'lucifer's dog');
    '> 
    '> mysql> 

^C
mysql>

MySQL에서는 이러한 특수 문자를 이스케이프 문자라고 하며 백슬래시 기호와 함께 입력해야 합니다.이므로 작은따옴표와 큰따옴표를 사용할 때는 각각 ' 또는 ", 백슬래시 입력 시 \, 기타 특수 문자에는 캐리지 리턴r, 줄 바꿈n, 탭 문자tab 코드>, 백스페이스 b code> 등 开头,所以在使用单引号和双引号时应分别输入 ' 或者 ",输入反斜线时应该输入 \,其他特殊字符还有回车符 r,换行符 n,制表符 tab,退格符 b 等。

mysql> create table lucifer (id int,name char(100));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into lucifer values (1,'lucifer\'s dog');
Query OK, 1 row affected (0.00 sec)

mysql> select * from lucifer;
+------+---------------+
| id   | name          |
+------+---------------+
|    1 | lucifer's dog |
+------+---------------+
1 row in set (0.00 sec)
mysql>

? 注意: 在向数据库中插入这些特殊字符时,一定要进行转义处理。

2、MySQL 中可以存储文件吗?

答案当然是可以的!

MySQL 中的 BLOBTEXT

mysql> create table view(id int unsigned NOT NULL AUTO_INCREMENT, catid int,title varchar(256),picture MEDIUMBLOB, content TEXT,PRIMARY KEY (id));
Query OK, 0 rows affected (0.03 sec)

mysql> show fields from view;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int unsigned | NO   | PRI | NULL    | auto_increment |
| catid   | int          | YES  |     | NULL    |                |
| title   | varchar(256) | YES  |     | NULL    |                |
| picture | mediumblob   | YES  |     | NULL    |                |
| content | text         | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql>

? 참고: 이러한 특수 문자를 데이터베이스에 삽입할 때는 반드시 이스케이프 처리하세요.

2. MySQL은 할 수 있습니다 파일은 ?

대답은 물론 그렇습니다! 🎜🎜BLOB 및 TEXT 필드 유형은 데이터 양을 저장할 수 있습니다. 파일은 이러한 데이터 유형을 사용하여 이미지, 사운드 또는 웹 페이지나 문서와 같은 큰 텍스트 콘텐츠를 저장할 수 있습니다. 🎜
mysql> select 'TRUE' from dual where 'DOG' = 'dog';
+------+
| TRUE |
+------+
| TRUE |
+------+
1 row in set (0.00 sec)
🎜BLOB 또는 TEXT를 사용하면 많은 양의 데이터를 저장할 수 있지만 이러한 필드를 처리하면 데이터베이스 성능이 저하됩니다. 🎜

? 注意: 如果并非必要,可以选择只储存文件的路径。

3、MySQL 中如何执行区分大小写的字符串比较?

MySQL 是 不区分大小写 的,因此字符串比较函数也不区分大小写。

mysql> select 'TRUE' from dual where 'DOG' = 'dog';
+------+
| TRUE |
+------+
| TRUE |
+------+
1 row in set (0.00 sec)

如果想执行区分大小写的比较,可以在字符串前面添加 BINARY 关键字。

mysql> select 'TRUE' from dual where BINARY'DOG' = 'dog';
Empty set (0.00 sec)

mysql>

例如默认情况下,’DOG‘=’dog‘ 返回结果为 TRUE,如果使用 BINARY 关键字,BINARY’DOG’=‘dog’ 结果为 FALSE,在区分大小写的情况下,’DOG’  与 ’dog’ 并不相同。

4、如何从日期时间值中获取年、月、日等部分日期或时间值?

MySQL 中,日期时间值以字符串形式存储在数据表中,因此可以使用字符串函数分别截取日期时间值的不同部分。

mysql> create table lucifer(date date);
Query OK, 0 rows affected (0.04 sec)

mysql> show fields from lucifer;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| date  | date | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into lucifer values (now());
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from lucifer;
+------------+
| date       |
+------------+
| 2021-11-25 |
+------------+
1 row in set (0.00 sec)

例如某个名称为 date 的字段有值 2021-11-25,如果只需要获得年值,可以输入 LEFT(date, 4),这样就获得了字符串左边开始长度为 4 的子字符串,即 YEAR 部分的值;

mysql> select LEFT(date, 4) from lucifer;
+---------------+
| LEFT(date, 4) |
+---------------+
| 2021          |
+---------------+
1 row in set (0.00 sec)

如果要获取月份值,可以输入 MID(date,6,2),字符串第 6 个字符开始,长度为 2 的子字符串正好为 date 中的月份值。同理,读者可以根据其他日期和时间的位置,计算并获取相应的值。

mysql> select MID(date,6,2) from lucifer;
+---------------+
| MID(date,6,2) |
+---------------+
| 11            |
+---------------+
1 row in set (0.00 sec)

5、如何改变默认的字符集?

CONVERT() 函数改变指定字符串的默认字符集!

MySQL 的安装和配置过程中,其中的一个步骤是可以选择 MySQL 的默认字符集。但是,如果只改变字符集,没有必要把配置过程重新执行一遍,在这里,一个简单的方式是 修改配置文件

读者可以在修改字符集时使用 SHOW VARIABLES LIKE 'character_set_%'; 或者 status 命令查看当前字符集,以进行对比。

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8mb3                    |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> status
--------------
mysql  Ver 8.0.26-0ubuntu0.21.04.3 for Linux on aarch64 ((Ubuntu))

Connection id:          10
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.26-0ubuntu0.21.04.3 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /var/run/mysqld/mysqld.sock
Binary data as:         Hexadecimal
Uptime:                 36 min 55 sec

Threads: 2  Questions: 325  Slow queries: 0  Opens: 181  Flush tables: 3  Open tables: 69  Queries per second avg: 0.146
--------------

mysql>

MySQL 配置文件名称为 my.cnf,该文件在 MySQL 的安装目录下面。修改配置文件中的 default-character-setcharacter-set-server 参数值,将其改为想要的字符集名称,如 gbk、gb2312、latinl 等,修改完之后重新启动 MySQL 服务,即可生效。

## 找到 my.cnf 位置
root@modb:~# find /etc -iname my.cnf -print
/etc/alternatives/my.cnf
/etc/mysql/my.cnf

## 修改字符集
在[client ]下面加入
default-character-set=utf8
在[ mysqld ] 下面加
character_set_server=utf8

## 重启 mysql 生效
service mysql restart

此时,登录 MySQL 后使用 SHOW VARIABLES LIKE 'character_set_%'; 或者 status 命令查看修改结果!

6、DISTINCT 可以应用于所有的列吗?

查询结果中,如果需要对列进行降序排序,可以使用 DESC,这个关键字只能对其前面的列 进行降序排列。

mysql> select * from lucifer;
+------+----------+
| id   | name     |
+------+----------+
|    1 | lucifer  |
|    2 | lucifer1 |
|    3 | lucifer2 |
+------+----------+
3 rows in set (0.00 sec)

mysql> select * from lucifer order by id desc;
+------+----------+
| id   | name     |
+------+----------+
|    3 | lucifer2 |
|    2 | lucifer1 |
|    1 | lucifer  |
+------+----------+
3 rows in set (0.00 sec)

例如,要对多列都进行降序排序,必须要在每一列的列名后面加 DESC 关键字。

mysql> select * from lucifer order by id desc,name desc;
+------+----------+
| id   | name     |
+------+----------+
|    3 | lucifer2 |
|    2 | lucifer1 |
|    1 | lucifer  |
+------+----------+
3 rows in set (0.00 sec)

DISTINCT 不同,DISTINCT 不能部分使用。换句话说,DISTINCT 关键字应用于所有列而不仅是它后面的第一个指定列。

例如,查询 2 个字段 sex,age,如果不同记录的这 2 个字段的组合值都不同,则所有记录都会被查询出来。

mysql> select * from lucifer;
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoli    | male   |   20 |
|    1 | xiaoliu   | female |   21 |
|    1 | xiaozhang | female |   21 |
|    1 | xiaowu    | female |   21 |
+------+-----------+--------+------+
4 rows in set (0.00 sec)

mysql> select distinct sex,age from lucifer;
+--------+------+
| sex    | age  |
+--------+------+
| male   |   20 |
| female |   21 |
+--------+------+
2 rows in set (0.00 sec)

mysql>

7、ORDER BY 可以和 LIMIT 混合使用吗?

在使用 ORDER BY 子句时,应保证其位于 FROM 子句之后,如果使用 LIMIT,则必须位于 ORDER BY 之后,如果子句顺序不正确,MySQL 将产生错误消息。

✅ 正确用法:

mysql> select * from lucifer order by age desc limit 2,4;
+------+--------+--------+------+
| id   | name   | sex    | age  |
+------+--------+--------+------+
|    1 | xiaowu | female |   21 |
|    1 | xiaoli | male   |   20 |
+------+--------+--------+------+
2 rows in set (0.00 sec)

❎ 错误用法:

mysql> select * from lucifer limit 2,4 order by age desc;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by age desc' at line 1
mysql>

8、什么时候使用引号?

在查询的时候,会看到在 WHERE 子句中使用条件,有的值加上了单引号,而有的值未加。

mysql> select * from lucifer where sex = 'female';
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoliu   | female |   21 |
|    1 | xiaozhang | female |   21 |
|    1 | xiaowu    | female |   21 |
+------+-----------+--------+------+
3 rows in set (0.00 sec)

mysql>

单引号用来限定字符串,如果将值与字符串类型列进行比较,则需要限定引号;而用来与数值进行比较则不需要用引号。

mysql> select * from lucifer where age = 20;
+------+--------+------+------+
| id   | name   | sex  | age  |
+------+--------+------+------+
|    1 | xiaoli | male |   20 |
+------+--------+------+------+
1 row in set (0.00 sec)

mysql>

9、在 WHERE子句中 AND 和 OR 必须使用圆括号吗?

任何时候使用具有 ANDOR 操作符的 WHERE 子句,都应该使用圆括号明确操作顺序。

mysql> select * from lucifer where (age = 20 or sex = 'female') and name != 'xiaowu';
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoli    | male   |   20 |
|    1 | xiaoliu   | female |   21 |
|    1 | xiaozhang | female |   21 |
+------+-----------+--------+------+
mysql> 3 rows in set (0.00 sec)

如果条件较多,即使能确定计算次序,默认的计算次序也可能会使 SQL 语句不易理解,因此使 用括号明确操作符的次序,是一个好的习惯。

10、更新或者删除表时必须指定 WHERE子 句吗?

个人建议所有的 UPDATE 和 DELETE 语句全都在 WHERE 子句中指定条件。

mysql> update lucifer set age = 22 where name = 'xiaoliu';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from lucifer where name = 'xiaoliu';
+------+---------+--------+------+
| id   | name    | sex    | age  |
+------+---------+--------+------+
|    1 | xiaoliu | female |   22 |
+------+---------+--------+------+
1 row in set (0.00 sec)

mysql>

如果省略 WHERE 子句,则 UPDATE 或 DELETE 将被应用到表中所有的行。

mysql> update lucifer set age = 22;
Query OK, 3 rows affected (0.01 sec)
Rows matched: 4  Changed: 3  Warnings: 0

mysql> select * from lucifer;
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoli    | male   |   22 |
|    1 | xiaoliu   | female |   22 |
|    1 | xiaozhang | female |   22 |
|    1 | xiaowu    | female |   22 |
+------+-----------+--------+------+
4 rows in set (0.00 sec)

mysql>

因此,除非确实打算更新或者删除所有记录,否则要注意使用不带 WHERE 子句的 UPDATE 或 DELETE  语句。

? 참고: 되돌릴 수 없는 결과를 방지하려면 테이블을 업데이트하고 삭제하기 전에 삭제해야 할 레코드를 확인하기 위해 SELECT 문을 사용하는 것이 좋습니다.

11. 인덱스는 데이터베이스 성능에 매우 중요한데 어떻게 사용해야 할까요?

인덱스의 장점:

  • 고유한 인덱스를 생성함으로써 데이터베이스 테이블의 각 데이터 행의 고유성을 보장할 수 있습니다.
  • 모든 MySQL 열 유형에 대해 인덱스를 설정할 수 있습니다.
  • 데이터 쿼리 속도를 크게 높일 수 있는데, 이것이 인덱스를 사용하는 주된 이유입니다.
  • 데이터의 참조 무결성을 달성하여 테이블 간의 연결 속도를 높일 수 있습니다.
  • 데이터 쿼리에 그룹화 및 정렬 절을 사용하면 쿼리에서 그룹화 및 정렬하는 시간도 크게 줄일 수 있습니다.

단점:

  • 인덱스 그룹을 만들고 유지하는 데 시간이 많이 걸립니다. 데이터 양이 늘어날수록 소요되는 시간도 늘어납니다.
  • 인덱스는 데이터 테이블이 차지하는 데이터 공간 외에도 일정량의 물리적 공간을 차지합니다. 인덱스 수가 많은 경우 인덱스 파일은 데이터 파일보다 더 빨리 최대 파일 크기에 도달할 수 있습니다.
  • 테이블의 데이터를 추가, 삭제, 수정하는 경우에도 인덱스를 동적으로 유지해야 하므로 데이터 유지 속도가 저하됩니다.

인덱스를 사용할 때는 인덱스의 장점과 단점을 고려해야 합니다.

데이터베이스에 적합한 인덱스를 선택하는 것은 복잡한 작업입니다. 열 수가 적은 인덱스에는 필요한 디스크 공간과 유지 관리 오버헤드가 적습니다. 큰 테이블에 여러 개의 결합된 인덱스가 생성되면 인덱스 파일도 빠르게 확장됩니다.

반면에 색인이 많을수록 더 많은 쿼리를 처리할 수 있습니다. 가장 효과적인 인덱스를 찾으려면 여러 가지 다른 디자인을 실험해야 할 수도 있습니다. 데이터베이스 스키마나 애플리케이션 디자인에 영향을 주지 않고 인덱스를 추가, 수정 및 삭제할 수 있습니다.

因此,应尝试多个不同的索引从而建立最优的索引。

12、尽量使用短索引(前缀索引)

对字符串类型的字段进行索引,如果可能应该指定一个前缀长度。

例如,如果有一个  CHAR(255) 的列,如果在前 10 个或 30 个字符内,多数值是惟一的,则不需要对整个列进行索引。

mysql> select * from lucifer;
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoli    | male   |   22 |
|    1 | xiaoliu   | female |   22 |
|    1 | xiaozhang | female |   22 |
|    1 | xiaowu    | female |   22 |
+------+-----------+--------+------+
4 rows in set (0.00 sec)

mysql> create index idx_lucifer_name on lucifer (name(4));
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from lucifer;
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name         | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| lucifer |          1 | idx_lucifer_name |            1 | name        | A         |           1 |        4 |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.01 sec)

mysql>

短索引不仅可以提高查询速度而且可以节省磁盘空间、减少 I/O 操作。

13、MySQL 存储过程和函数有什么区别?

在本质上它们都是存储程序。

函数:

  • 只能通过 return 语句返回单个值或者表对象;
  • 限制比较多,不能用临时表,只能用表变量,还有一些函数都不可用等等;
  • 可以嵌入在 SQL 语句中使用,可以在 SELECT 语句中作为查询语句的一个部分调用;

存储过程:

  • 반환은 허용되지 않지만 out 매개변수를 통해 여러 값이 반환될 수 있습니다.
  • 에는 상대적으로 제한이 적습니다.
  • 은 일반적으로 독립적인 부분으로 실행됩니다. , 저장 프로시저의 내용을 변경할 수 있나요?

안돼! 현재 MySQL은 기존 저장 프로시저 코드에 대한 수정 기능을 제공하지 않습니다. 저장 프로시저를 수정해야 하는 경우 DROP 문을 사용하여 삭제한 후 코드를 다시 작성하거나 새 저장 프로시저를 만들어야 합니다.

이 점에서는 오라클이 더 낫다고 말하고 싶습니다.

15. 저장 프로시저 중에 다른 저장 프로시저를 호출할 수 있나요?

예! 저장 프로시저에는 사용자 정의 SQL 문 집합이 포함되어 있습니다. CALL 문을 사용하여 저장 프로시저를 호출할 수도 있습니다. DROP 문을 사용하여 다른 저장 프로시저를 삭제할 수 없습니다.

16. 저장 프로시저의 매개변수는 데이터 테이블의 필드 이름과 달라야 합니다.

저장 프로시저 매개 변수 목록을 정의할 때 데이터베이스 테이블의 필드 이름과 매개 변수 이름을 구별하도록 주의해야 합니다. 그렇지 않으면 예기치 않은 결과가 발생합니다.

17. 저장 프로시저의 매개변수를 중국어로 설정할 수 있나요?

일반적인 상황에서는 중국어 매개변수가 저장 프로시저에 전달될 수 있습니다. 예를 들어 저장 프로시저가 사용자 이름을 기반으로 사용자 정보를 검색하는 경우 전달되는 매개변수 값은 중국어일 수 있습니다. 이때 저장 프로시저를 정의할 때 마지막에 문자 세트 gbk를 추가해야 합니다. 그렇지 않으면 중국어 매개변수를 사용하여 저장 프로시저를 호출할 때 오류가 발생합니다. 예를 들어 userInfo 저장 프로시저를 정의하면 코드는 다음과 같습니다.

CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) 문자 세트 gbk, OUT u_age INT)

18 MySQL의 뷰와 테이블 간의 차이점과 연결은 무엇입니까?

둘의 차이점:

  • 뷰는 SQL 문의 결과 집합을 기반으로 하는 시각적 테이블인 컴파일된 SQL 문이지만 테이블은
  • 이 아닙니다. 뷰에는 실제 물리 기록이 없지만 기본 테이블에는
  • 테이블이 내용이고 뷰가 창입니다.
  • 테이블은 물리적 공간을 차지하지만 뷰는 물리적 공간을 차지하지 않습니다. 테이블은 시간에 따라 수정될 수 있지만 뷰는 생성된 문으로만 수정될 수 있습니다.
  • 뷰는 데이터 테이블의 특정 필드로 구성된 데이터를 쿼리할 수 있습니다. 이는 단지 SQL 문의 모음일 뿐입니다. 보안 관점에서 보기는 사용자가 데이터 테이블을 만지는 것을 방지할 수 있으므로 사용자는 테이블 구조를 알 수 없습니다.
  • 테이블은 전역 스키마의 테이블에 속하며 실제 테이블 보기는 로컬의 테이블에 속합니다.
  • 뷰 생성 및 삭제는 해당 기본 테이블이 아닌 뷰 자체에만 영향을 미칩니다.

둘 사이의 연결:

뷰(뷰)는 테이블입니다. 기본 테이블을 기반으로 구축되며, 그 구조(즉, 정의된 컬럼)와 내용(즉, 모든 레코드)은 기본 테이블에서 나오며, 기본 테이블의 존재를 기반으로 존재합니다.

一个视图可以对应一个基本表,也可以对应多个基本表。

视图是基本表的抽象和在逻辑意义上建立的新关系。

19、使用触发器时须特别注意!

在使用触发器的时候需要注意,对于相同的表,相同的事件只能创建一个触发器。

mysql> create trigger lucifer_tri before insert on lucifer for each row set NEW.id=NEW.id+1;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> 
mysql> select * from lucifer;
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoli    | male   |   22 |
|    1 | xiaoliu   | female |   22 |
|    1 | xiaozhang | female |   22 |
|    1 | xiaowu    | female |   22 |
|    1 | lucifer   | male   |   20 |
|    1 | lucifer   | male   |   20 |
+------+-----------+--------+------+
6 rows in set (0.00 sec)

mysql> insert into lucifer values(1,'lucifer','male',20);
Query OK, 1 row affected (0.00 sec)

mysql> select * from lucifer;
+------+-----------+--------+------+
| id   | name      | sex    | age  |
+------+-----------+--------+------+
|    1 | xiaoli    | male   |   22 |
|    1 | xiaoliu   | female |   22 |
|    1 | xiaozhang | female |   22 |
|    1 | xiaowu    | female |   22 |
|    1 | lucifer   | male   |   20 |
|    1 | lucifer   | male   |   20 |
|    2 | lucifer   | male   |   20 |
+------+-----------+--------+------+
7 rows in set (0.00 sec)

比如对表 lucifer 创建了一个 BEFORE INSERT 触发器,那么如果对表 lucifer 再次创建一个 BEFORE INSERT 触发器,MySQL 将会报错,此时,只可以在表 lucifer 上创建 AFTER INSERT 或者 BEFORE UPDATE 类型的触发器。

mysql> create trigger lucifer_tri before insert on lucifer for each row set NEW.id=NEW.id+1;
ERROR 1359 (HY000): Trigger already exists
mysql>

灵活的运用触发器将为操作省去很多麻烦。

20、及时删除不再需要的触发器

触发器定义之后,每次执行触发事件,都会激活触发器并执行触发器中的语句。

如果需求发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响新的数据的完整性。

mysql> drop trigger lucifer_tri;
Query OK, 0 rows affected (0.03 sec)

mysql>

因此,要将不再使用的触发器及时删除。

21、应该使用哪种方法创建用户?(3种方式)

创建用户有 3 种方法:

  • 使用 CREATE USER 语句创建用户
  • 在 mysql.user 表中添加用户
  • 使用 GRANT 语句创建用户(仅限 MySQL 8 版本以下使用)

一般情况, 最好使用 GRANT 或者 CREATE USER 语句,而不要直接将用户信息插入 user 表,因为 user 表中存储了全局级别的权限以及其他的账户信息,如果意外破坏了 user 表中的记录,则可能会对  MySQL 服务器造成很大影响。

-- 使用 CREATE USER 语句创建用户
mysql> create user 'lucifer'@'localhost' identified by 'lucifer';
Query OK, 0 rows affected (0.01 sec)

mysql> 

-- 在 mysql.user 表中添加用户
mysql> select MD5('lucifer');
+----------------------------------+
| MD5('lucifer')                   |
+----------------------------------+
| cae33a0264ead2ddfbc3ea113da66790 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> 
mysql> INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, ssuex509_i09_sr, x5ubject) VALUES ('lohoscalt',uci 'lfer MD5('1',lucifer'), '', '',; '')
Query OK, 1 row affected (0.01 sec)

mysql> 

-- 使用 GRANT 语句创建用户
mysql> GRANT SELECT ON*.* TO 'lucifer2'@localhost IDENTIFIED BY 'lucifer';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'lucifer'' at line 1
mysql>

? 注意: 由于测试使用的是 MySQL 8 版本,已经不支持 GRANT 直接创建用户,5.7 版本依然是支持的。

22、mysqldump 备份的文件只能在 MySQL 中使用吗?

逻辑备份工具,适用于所有的存储引擎,支持温备、完全备份、部分备份、对于 InnoDB 存储引擎支持热备。

mysqldump 备份的文本文件实际是数据库的一个副本,使用该文件不仅可以在 MySQL 中恢复数据库,而且通过对该文件的简单修改,可以使用该文件在 SQL Server 或者 Sybase 等其他数据库中恢复数据库。

root@modb:~# mysqldump -uroot -p hr > /root/hr.db
Enter password: 
root@modb:~# 
root@modb:~# ll hr.db 
-rw-r--r-- 1 root root 25327 Nov 26 08:52 hr.db

这在某种程度上实现了数据库之间的迁移。

23. 백업 도구를 선택하는 방법은 무엇입니까?

백업 방법(데이터베이스가 오프라인이어야 하는지 여부)에 따라 백업은 다음과 같이 나눌 수 있습니다.

  • 핫 백업
  • 콜드 백업
  • 웜 백업 )

언제 MySQL에서 다양한 백업 방법을 수행하려면 스토리지 엔진이 이를 지원하는지 여부도 고려해야 합니다. 예를 들어 MyISAM은 핫 백업을 지원하지 않지만 웜 백업과 콜드 백업을 지원합니다. InnoDB는 핫 스탠바이, 웜 스탠바이, 콜드 스탠바이를 지원합니다.

일반적으로 백업해야 하는 데이터는 다음 범주로 나뉩니다.

  • 테이블 데이터
  • 바이너리 로그, InnoDB 트랜잭션 로그
  • 코드(저장 프로시저, 저장 함수, 트리거, 이벤트 스케줄링) 서버)
  • 서버 구성 파일

다음은 일반적으로 사용되는 몇 가지 백업 도구입니다.

  • mysqldump:逻辑备份工具,适用于所有的存储引擎,支持温备、完全备份、部分备份、对于 InnoDB 存储引擎支持热备。
  • cp、tar 等归档复制工具:物理备份工具,适用于所有的存储引擎、冷备、完全备份、部分备份。
  • lvm2 snapshot:借助文件系统管理工具进行备份。
  • mysqlhotcopy:名不副实的一个工具,仅支持 MyISAM 存储引擎。
  • xtrabackup:一款由 percona 提供的非常强大的 InnoDB/XtraDB 热备工具,支持完全备份、增量备份。

直接复制数据文件是最为直接、快速的备份方法,但缺点是基本上不能实现增量备份。备份时必须确保没有使用这些表。如果在复制一个表的同时服务器正在修改它,则复制无效。备份 文件时,最好关闭服务器,然后重新启动服务器。

24、平时应该打开哪些日志?

日志既会影响 MySQL 的性能,又会占用大量磁盘空间。因此,如果不必要,应尽可能少地 开启日志。

根据不同的使用环境,可以考虑开启不同的日志。

例如,在开发环境中优化查询效率低的语句,可以开启慢查询日志;

开启慢查询日志: 可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。

-- 检查是否开启慢查询
mysql> show variables like 'slow_query%';
+---------------------+------------------------------+
| Variable_name       | Value                        |
+---------------------+------------------------------+
| slow_query_log      | OFF                          |
| slow_query_log_file | /var/lib/mysql/modb-slow.log |
+---------------------+------------------------------+
2 rows in set (0.00 sec)

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)

-- 开启慢查询日志
mysql> set global slow_query_log='ON'; 
Query OK, 0 rows affected (0.00 sec)

-- 设置查询超过10秒就记录
mysql> set global long_query_time=10;
Query OK, 0 rows affected (0.00 sec)

-- 再次检查是否开启
mysql> show variables like 'slow_query%';
mysql> +---------------------+------------------------------+
| Variable_name       | Value                        |
+---------------------+------------------------------+
| slow_query_log      | ON                           |
| slow_query_log_file | /var/lib/mysql/modb-slow.log |
+---------------------+------------------------------+
2 rows in set (0.00 sec)

如果需要记录用户的所有查询操作,可以开启通用查询日志;

mysql> show variables like 'general_log%';
+------------------+-------------------------+
| Variable_name    | Value                   |
+------------------+-------------------------+
| general_log      | OFF                     |
| general_log_file | /var/lib/mysql/modb.log |
+------------------+-------------------------+
2 rows in set (0.00 sec)

-- 开启通用查询日志
mysql> SET GLOBAL general_log=1; 
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'general_log%';
+------------------+-------------------------+
| Variable_name    | Value                   |
+------------------+-------------------------+
| general_log      | ON                      |
| general_log_file | /var/lib/mysql/modb.log |
+------------------+-------------------------+
2 rows in set (0.00 sec)

如果需要记录数据的变更,可以开启二进制日志;错误日志是默认开启的。

mysql> show variables like 'log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
+---------------------------------+-----------------------------+
5 rows in set (0.00 sec)

mysql>

25、如何使用二进制日志?

二进制日志主要用来记录数据变更。

如果需要记录数据库的变化,可以开启二进制日志。基于二进制日志的特性,不仅可以用来进行数据恢复,还可用于数据复制。

root@modb:/var/lib/mysql# ls binlog*
binlog.000001  binlog.000002  binlog.index
root@modb:/var/lib/mysql# mysqlbinlog binlog.000001 | mysql -u root -p                                            
Enter password: 
root@modb:/var/lib/mysql#

在数据库定期备份的 情况下,如果出现数据丢失,可以先用备份恢复大部分数据,然后使用二进制日志恢复最近备份后变更的数据。在双机热备情况下,可以使用 MySQL 的二进制日志记录数据的变更,然后将变更部分复制到备份服务器上。

26、如何使用慢查询日志?

慢查询日志主要用来记录查询时间较长的日志。

在开发环境下,可以开启慢查询日志来记录查询时间较长的查询语句,然后对这些语句进行优化。

root@modb:/var/lib/mysql# cat /var/lib/mysql/modb-slow.log
/usr/sbin/mysqld, Version: 8.0.26-0ubuntu0.21.04.3 ((Ubuntu)). started with:
Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
root@modb:/var/lib/mysql#

通过配 long_query_time 的值,可以灵活地掌握不同程度的慢查询语句。

27、是不是索引建立得越多越好?

合理的索引可以提高查询的速度,但不是索引越多越好。

在执行插入语句的时候,MySQL 要为新插入的记录建立索引。所以过多的索引会导致插入操作变慢。原则上是只有查询用的字段才建立索引。

使用索引时,需要综合考虑索引的优点和缺点。

28、如何使用查询缓冲区?

查询缓冲区可以提高查询的速度,但是这种方式只适合查询语句比较多、更新语句比较少 的情况。

默认情况下查询缓冲区的大小为 0,也就是不可用。可以修改 queiy_cache_size 以调整查询缓冲区大小;修改 query_cache_type 以调整查询缓冲区的类型。

my.cnf 中修改 query_cache_sizequery_cache_type 的值如下所示:

[mysqld]
query_cache_size= 512M 
query_cache_type= 1
query_cache_type=1

表示开启查询缓冲区。

只有在查询语句中包含 SQL_NO_CACHE 关键字时,才不会使用查询缓冲区。可以使用 FLUSH QUERY CACHE 语句来刷新缓冲区,清理查询缓冲区中的碎片。

위 내용은 MySQL을 배우기 위해 알아야 할 28가지 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제