bitsCN.com
创建数据库luowei
mysql> CREATE DATABASE luowei;
使用数据库
mysql> use luowei
创建表study
mysql> CREATE TABLE study ( ID bigint(20) NOT NULL AUTO_INCREMENT UNIQUE, Name varchar(255) NOT NULL, Age int(10),Gender enum('F','M') DEFAULT 'M');
查询表study;
mysql> SELECT * FROM study;
查看表的结构:
mysql> DESC study;
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
+--------+---------------+------+-----+---------+----------------+
插入数据;
mysql> INSERT INTO study (Name) VALUE ('luowei'); //单个插入
mysql> INSERT INTO study (Name) VALUE ('Qi'),('Ro'),('RQ'); //批量插入
mysql> INSERT INTO study SET Name='Hua'; //使用SET插入
mysql> SELECT * FROM study;
+----+--------+------+--------+
| ID | Name | Age | Gender |
+----+--------+------+--------+
| 1 | luowei | NULL | M |
| 2 | Qi | NULL | M |
| 3 | Ro | NULL | M |
| 4 | RQ | NULL | M |
| 5 | Hua | NULL | M |
+----+--------+------+--------+
5 rows in set (0.00 sec)
这是插入数据后的一个简单的表的内容
修改表的数据
mysql> UPDATE study SET Gender='F' WHERE ID=2; //把ID=2的Gender改为F
mysql> UPDATE study SET Gender='F' WHERE ID IN (4,5);//批量处理
mysql> SELECT * FROM study;
+----+--------+------+--------+
| ID | Name | Age | Gender |
+----+--------+------+--------+
| 1 | luowei | NULL | M |
| 2 | Qi | NULL | F |
| 3 | Ro | NULL | M |
| 4 | RQ | NULL | F |
| 5 | Hua | NULL | F |
+----+--------+------+--------+
删除表中的数据
mysql> DELETE FROM study WHERE ID=5;//删除指定的行
mysql> SELECT * FROM study;
+----+--------+------+--------+
| ID | Name | Age | Gender |
+----+--------+------+--------+
| 1 | luowei | NULL | M |
| 2 | Qi | NULL | F |
| 3 | Ro | NULL | M |
| 4 | RQ | NULL | F |
+----+--------+------+--------+
但是这个时候如果我们在再次插入的话ID号会从原来删除的编号增加
mysql> SELECT LAST_INSERT_ID();//显示上次插入的是第几个
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 5 |
+------------------+
mysql> INSERT INTO study (Name) VALUE ('aQ');
mysql> SELECT * FROM study;
+----+--------+------+--------+
| ID | Name | Age | Gender |
+----+--------+------+--------+
| 1 | luowei | NULL | M |
| 2 | Qi | NULL | F |
| 3 | Ro | NULL | M |
| 4 | RQ | NULL | F |
| 6 | aQ | NULL | M |
+----+--------+------+--------+
看到了吧,不是依次增长的,而是有间隔,现在我们在删除了ID为6的行,然后插入设置他的ID为5,接着再自动插入;
mysql> DELETE FROM study WHERE ID=6;
mysql> INSERT INTO study SET ID=5,Name='pk';
mysql> INSERT INTO study (Name) VALUE ('jk');
mysql> SELECT * FROM study;
+----+--------+------+--------+
| ID | Name | Age | Gender |
+----+--------+------+--------+
| 1 | luowei | NULL | M |
| 2 | Qi | NULL | F |
| 3 | Ro | NULL | M |
| 4 | RQ | NULL | F |
| 5 | pk | NULL | M |
| 7 | jk | NULL | M |
+----+--------+------+--------+
可以看出还是不会按照我们的意思让他接着自动增长,这个时候我们可以通过设置,让他重新按照我们设置的为起点自动增长
mysql> DELETE FROM study WHERE ID=7;
mysql> ALTER TABLE study AUTO_INCREMENT=5;//设置自动增长的起点
mysql> INSERT INTO study (Name) VALUE ('jk');
mysql> INSERT INTO study (Name) VALUE ('OL');
mysql> SELECT * FROM study;
+----+--------+------+--------+
| ID | Name | Age | Gender |
+----+--------+------+--------+
| 1 | luowei | NULL | M |
| 2 | Qi | NULL | F |
| 3 | Ro | NULL | M |
| 4 | RQ | NULL | F |
| 5 | pk | NULL | M |
| 6 | jk | NULL | M |
| 7 | OL | NULL | M |
+----+--------+------+--------+
又OK了,我估计QQ在设置QQ号的时候也是通过这种方式,保留小于5位的QQ号,所有大家用的都是7位以上的(题外话,呵呵)。
修改表结构
如果想插入一个新的字段,可以使用ALTER来修改
mysql> DESC study;//原本表的结构
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
+--------+---------------+------+-----+---------+----------------+
mysql> ALTER TABLE study ADD Work INT ;
mysql> DESC study;
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
| Work | int(11) | YES | | NULL | |
+--------+---------------+------+-----+---------+----------------+
默认插入最后一行,如果想插入指定的行,可以使用AFTER,FIRST等参数
mysql> ALTER TABLE study ADD Master VARCHAR(30) AFTER Gender;
mysql> DESC study;
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
| Master | varchar(30) | YES | | NULL | |
| Work | int(11) | YES | | NULL | |
+--------+---------------+------+-----+---------+----------------+
这就把新插入的字段放在了Gender的后面了
如果我们想把原来的表中字段的名字改一下,比如我想把Work改成work
mysql> ALTER TABLE study CHANGE Work work INT;//修改表中的字段
mysql> DESC study;
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
| Master | varchar(30) | YES | | NULL | |
| work | int(11) | YES | | NULL | |
+--------+---------------+------+-----+---------+----------------+
可以实现效果
当让还可以通过使用MODIFY来试下对表中字段的属性进行设置
mysql> ALTER TABLE study MODIFY work VARCHAR(30) NOT NULL ;
mysql> DESC study;
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
| Master | varchar(30) | YES | | NULL | |
| work | varchar(30) | NO | | NULL | |
+--------+---------------+------+-----+---------+----------------+
但是如果你表中原本work中没有字段的话,会有warning,所以在你做的时候可以先添加数据,然后在修改。
随着发展,我发现后面的work这个字段没用了,想删除study表中的这个属性
mysql> ALTER TABLE study DROP work;
mysql> DESC study;
+--------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| Name | varchar(255) | NO | | NULL | |
| Age | int(10) | YES | | NULL | |
| Gender | enum('F','M') | YES | | M | |
| Master | varchar(30) | YES | | NULL | |
+--------+---------------+------+-----+---------+----------------+
当然如果我们表中有索引(目前),也可以使用DROP删除索引
mysql> SHOW INDEX FROM study;//查看表的索引
mysql> ALTER TABLE study ADD INDEX index_name(Name);//添加索引
也可以私用KEY(mysql> ALTER TABLE study ADD KEY index_name(Name);)
mysql> SHOW INDEX FROM study;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| study | 0 | ID | 1 | ID | A | 7 | NULL | NULL | | BTREE | |
| study | 1 | index_name | 1 | Name | A | NULL | NULL | NULL | | BTREE | |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
mysql> ALTER TABLE study DROP INDEX index_name;//删除索引
现在我觉得表明有点长,想换一个短的来方便下面的实验,当然在实际的过程中,我们应该见名知意
mysql> ALTER TABLE study RENAME TO st;//把表名从study改成st
mysql> SHOW TABLES;
+------------------+
| Tables_in_luowei |
+------------------+
| st |
+------------------+
想查看当前的数据库可以使用一下命令
mysql> SELECT DATABASE();
mysql> SHOW TABLES;//显示当前数据库中的表
mysql> SELECT * FROM st;
+----+--------+------+--------+--------+
| ID | Name | Age | Gender | Master |
+----+--------+------+--------+--------+
| 1 | luowei | NULL | M | NULL |
| 2 | Qi | NULL | F | NULL |
| 3 | Ro | NULL | M | NULL |
| 4 | RQ | NULL | F | NULL |
| 5 | pk | NULL | M | NULL |
| 6 | jk | NULL | M | NULL |
| 7 | OL | NULL | M | NULL |
+----+--------+------+--------+--------+
这里我只有一个表,现在我修改一下表中的数据,把Master的类型改为INT,并添加一些数据在里面
mysql> ALTER TABLE st CHANGE MODIFY Master INT;
mysql> UPDATE st SET Master=1 WHERE ID=1;
mysql> UPDATE st SET Master=2 WHERE ID=2;
mysql> UPDATE st SET Master=3 WHERE ID=3;
mysql> UPDATE st SET Master=4 WHERE ID=4;
mysql> UPDATE st SET Master=7 WHERE ID=5;
mysql> UPDATE st SET Master=8 WHERE ID=6;
mysql> UPDATE st SET Master=5 WHERE ID=7;
mysql> SELECT * FROM st;
+----+--------+------+--------+--------+
| ID | Name | Age | Gender | Master |
+----+--------+------+--------+--------+
| 1 | luowei | NULL | M | 1 |
| 2 | Qi | NULL | F | 2 |
| 3 | Ro | NULL | M | 3 |
| 4 | RQ | NULL | F | 4 |
| 5 | pk | NULL | M | 7 |
| 6 | jk | NULL | M | 8 |
| 7 | OL | NULL | M | 5 |
+----+--------+------+--------+--------+
现在表的基本情况如上所示。当然我们为了方便记录Master,使用是INT来标,其实Master是一个姓名,所以我们再建立一个新表mt,来记录Master的对应的关系
mysql> CREATE TABLE mt(
-> id INT NOT NULL UNIQUE AUTO_INCREMENT ,
-> name VARCHAR(30) NOT NULL );
mysql> INSERT INTO mt (name) VALUE ('A');
......
自己多插入几行,我这里就省略了
mysql> SELECT * FROM mt;
+----+------+
| id | name |
+----+------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
| 6 | F |
+----+------+
好了现在两个表准备好了,接下来我将做一下多表之间的查询
多表之间的查询可以分为:
交叉查询:笛卡尔乘积,两表相乘;
内连接:对称连接,就是显示两个表中都有的,一个表中如果没有,就不显示了;
外连接:非对称连接
左外连接:LEFT JOIN ON 左表中的都显示,右表中无的话显示为NULL
右外连接:RIGHT JOIN ON 右表中的都显示,左表中无的话显示为NULL
自连接:一个表中的一列建立在同张表的另一列;
UNION:连接两个表;
接下来分别对上面的情况进行实验;
1.交叉查询:
mysql> SELECT * FROM st,mt;
42 rows in set (0.00 sec)//中间的数据就省略了,这里的结果就是两个表的行数相乘的结果;
2.内连接:
mysql> SELECT st.Name,mt.name FROM st,mt WHERE st.Master=mt.id;
+--------+------+
| Name | name |
+--------+------+
| luowei | A |
| Qi | B |
| Ro | C |
| RQ | D |
| OL | E |
+--------+------+
3.左外连接:
mysql> SELECT st.Name,mt.name FROM st LEFT JOIN mt ON st.Master=mt.id;
+--------+------+
| Name | name |
+--------+------+
| luowei | A |
| Qi | B |
| Ro | C |
| RQ | D |
| pk | NULL |
| jk | NULL |
| OL | E |
+--------+------+
这时候我们可以看到,凡是左表中有的,都显示了,右表中没有的都显示为NULL了;
4.右外连接:
mysql> SELECT st.Name,mt.name FROM st RIGHT JOIN mt ON st.Master=mt.id;
+--------+------+
| Name | name |
+--------+------+
| luowei | A |
| Qi | B |
| Ro | C |
| RQ | D |
| OL | E |
| NULL | F |
+--------+------+
5.自连接:
mysql> SELECT k1.Name,k2.Gender FROM st AS k1,st AS k2 WHERE k1.ID = k2.Master;
+--------+--------+
| Name | Gender |
+--------+--------+
| luowei | M |
| Qi | F |
| Ro | M |
| RQ | F |
| OL | M |
| pk | M |
+--------+--------+
6.UNION;
mysql> SELECT ID AS new_id,Name AS new_name FROM st UNION SELECT id AS new_id,name AS new_name FROM mt;
+--------+----------+
| new_id | new_name |
+--------+----------+
| 1 | luowei |
| 2 | Qi |
| 3 | Ro |
| 4 | RQ |
| 5 | pk |
| 6 | jk |
| 7 | OL |
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
| 6 | F |
+--------+----------+
13 rows in set (0.00 sec)这样就把两个表连接到了一起了。
多表操作就到此了,接下来要说的是数据库中的视图,子查询,事务,同步的相关知识了;
我就以st这个表为基础:
mysql> SELECT * FROM st;
+----+--------+------+--------+--------+
| ID | Name | Age | Gender | Master |
+----+--------+------+--------+--------+
| 1 | luowei | NULL | M | 1 |
| 2 | Qi | NULL | F | 2 |
| 3 | Ro | NULL | M | 3 |
| 4 | RQ | NULL | F | 4 |
| 5 | pk | NULL | M | 7 |
| 6 | jk | NULL | M | 8 |
| 7 | OL | NULL | M | 5 |
+----+--------+------+--------+--------+
视图:就是建立在基表上执行查询语句的一系列的虚表
创建视图:
mysql> CREATE VIEW view AS SELECT ID,Name,Gender FROM st;//创建一个查询显示ID,Name,Gender的视图;
mysql> SELECT * FROM view;
+----+--------+--------+
| ID | Name | Gender |
+----+--------+--------+
| 1 | luowei | M |
| 2 | Qi | F |
| 3 | Ro | M |
| 4 | RQ | F |
| 5 | pk | M |
| 6 | jk | M |
| 7 | OL | M |
+----+--------+--------+
删除视图可以使用
mysql> DROP VIEW view;
子查询语句:(其实MySQL的子查询支持的还不是很好)
mysql> SELECT * FROM view WHERE ID > 0;
我就借用刚建立的视图进行查询,其实这个是多此一举的做法,呵呵,只是演示一下效果,当让在工作中可能会遇到更多的问题的。
事务:transact
事务就是几个Sql语句要么都执行,要么都不执行,这样就防治一方执行,另一方没执行,从而产生虚拟的假象,比如A通过银行向B转账,如果这个时候A刚转出去,B那边的断电了(假设,其实这样的事出现的概率还是蛮小的,呵呵),所以等A和B见面之后,就说不清了,所以事务就是如果两个都没实现,就是A发送成功,B接受成功,才能算是真正的成功,所以这样就能避免不必要的损失。
接下来介绍一下事务隔离的级别:
1.读未提交 READ UNCOMMITED
2.读提交 READ COMMITED
3.可重读 REPEATABLE READ 默认
4.串行化 SERIABLIZABLE
从1-->4隔离级别依次增加,并发性依次降低
mysql> SHOW VARIABLES LIKE 'tx_isolation';//查看系统使用的默认的隔离级别
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
但是如果我们的数据库使用的引擎是MyISAM的话,就不支持事务,查看数据库使用的引擎命令如下
mysql> SHOW ENGINES;或使用SHOW TABLE STATUS LIKE 'st';或使用SHOW TABLE STATUS ;都能查看
+------------+---------+----------------------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+----------------------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
| BerkeleyDB | YES | Supports transactions and page-level locking |
| BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | NO | Archive storage engine |
| CSV | NO | CSV storage engine |
| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables |
| FEDERATED | NO | Federated MySQL storage engine |
| MRG_MYISAM | YES | Collection of identical MyISAM tables |
| ISAM | NO | Obsolete storage engine |
+------------+---------+----------------------------------------------------------------+
显示为DEFAULT的是默认使用的引擎,应为这个时候数据库不支持事务,为了演示事务的效果,我把mysql的引擎改为InnoDB ,使用如下命令:
mysql> SET SESSION storage_engine = InnoDB;
然后在这个引擎的基础上建立一个表
mysql> CREATE TABLE tt (
-> tid INT UNIQUE NOT NULL AUTO_INCREMENT,
-> tname VARCHAR(30) NOT NULL,
-> tage INT);
插入数据如下图所示,当然你可以自己随便添加表中的数据
mysql> SELECT * FROM tt;
+-----+-------+------+
| tid | tname | tage |
+-----+-------+------+
| 1 | ser | NULL |
| 2 | linux | NULL |
| 3 | php | NULL |
+-----+-------+------+
查看当前表的存储引擎
mysql> SHOW TABLE STATUS LIKE 'tt';
显示的结果是InnoDB的引擎;
1.设置为READ UNCOMMITTED(读未提交)的级别
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;//修改隔离级别为READ UNCONMMITED显示为REPEATABLE-READ
mysql> SHOW VARIABLES LIKE 'tx_isolation';
+---------------+------------------+
| Variable_name | Value |
+---------------+------------------+
| tx_isolation | READ-UNCOMMITTED |
+---------------+------------------+
这个级别下,如果两个事务同时进行,任何一方的改变,对方都能看到,因为我们在设置的时候采用的是SESSION,会话的模式,所以两个终端都要进行READ UNCOMMITTED设置
所以这个的设置的并发性最好,但是受到的影响却是最大的
2.设置为READ COMMITED(读提交)级别
这个级别下,当其中的任意一个事务提交了,其他处于事务状态的就能同步到信息,如下图是没有提交之前的图,这个时候还不能看到
如果B的事务提交了,再来看看这个结果,如下图所示:
尽管A没有提交,但是也能看到信息了
3.设置为REPEATABLE READ(可重读)级别
如果设置为这个级别的话,两个同时进行的事务,相互不受影响,只用当两个事务都提交了才能看到所有变化的信息,否则,各自只能看到自己完成的
我现在打开两个终端A、B,同时进入事务
mysql> START TRANSACTION;//A进入事务状态
mysql> START TRANSACTION;//B进入事务状态
然后我在B事务状态下向表进行插入一行数据,然后在两个表中都查看,结果发现数据不一样,如下图所示:
如果我现在把B的事务提交了,再在A、B上查看,发现只有B上的有新插入的一行,而A任然没有,如图所示:
如果我现在把A的也提交了,在查看的话,两个就会出现数据同步了,如图所示:
这就是REPEATABLE READ级别的效果,就是两个事务操作的时候相互不干扰,只有当两个事务都提交了,数据才会同步。
4.设置为SERIABLIZABLE级别
这个时候只有当前一个事务执行完成并提交了,下一个事务才开始,做了更加严格的限制,所以一般不做这样的级别限制
同步:(clock)
通过锁机制来解决同步问题
锁:
共享锁(读锁):
独占锁(写锁):
写锁的优先级高于读锁
锁级别:
表锁,行锁,页锁(内存空间)
锁的实现:
服务器级别的;只能实现表锁
存储引擎级别的:可以实现行锁
>LOCK TABLES tab_name READ;加锁
>UNLOCK TABLES;释放锁
(注意:如果在InnoDB中,定义时候并不生效,只有真正的事务开始,
定义的锁才生效)
降低粒度,可以更好的支持并发性,这样锁的颗粒就越小,类似行锁,锁的
范围小一些。
MYSQL的用户管理:
创建用户
CREATE USER username@host
删除用户
DROP USER username@host
授权
GRANT PRIV_LIST ON db.table TO username@host [IDENTIFIED BY 'redhat'];
收回权限
REVOKE priv_list ON db.table FROM username@host;
WITH GRANT OPTION 同时把授权也一并授权给他
设置其使用的资源:
WITH MAX_QUERIES_PER_HOUT N;每个小时只能做N次查询
WITH MAX_UPDATES_PER_HOUT N每个小时只能做N次更新
WITH MAX_CONNECTIONS_PER_HOUT N 每个小时只能做N次连接
WITH MAX_USER_CONNECTIONS N 每个用户同时最大连接数
FLUSH USER_RESOURCES;
GRANT SELECT(name) ON db.table TO uername@host;字段级别的权限
执行存储过程的权限
GRANT EXECUTE ON XXXX TO username@host
忘记MySQL的密码:
方法1.重装数据库
方法2.
vim /etc/init.d/mysqld
先停止MySQL服务
#service mysqld stop
找到mysqld的二进制文件的位置,我这里就在/user/local/mysql/下
#/user/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking & 后台运行安全模式
然后连接数据库
#mysql
>use mysql
>UPDATE user SET Password=PASSWORD('redhat') WHERE User='root' AND Host='localhost';
>UPDATE user SET Password=PASSWORD('redhat') WHERE User='root' AND Host='127.0.0.1';
#killall mysqqld
#service mysqld start
#mysql -uroot -p 登录
作者 “IT梦-齐-分享”

산성 속성에는 원자력, 일관성, 분리 및 내구성이 포함되며 데이터베이스 설계의 초석입니다. 1. 원자력은 거래가 완전히 성공적이거나 완전히 실패하도록합니다. 2. 일관성은 거래 전후에 데이터베이스가 일관성을 유지하도록합니다. 3. 격리는 거래가 서로를 방해하지 않도록합니다. 4. 지속성은 거래 제출 후 데이터가 영구적으로 저장되도록합니다.

MySQL은 데이터베이스 관리 시스템 (DBMS) 일뿐 만 아니라 프로그래밍 언어와 밀접한 관련이 있습니다. 1) DBMS로서 MySQL은 데이터를 저장, 구성 및 검색하는 데 사용되며 인덱스 최적화는 쿼리 성능을 향상시킬 수 있습니다. 2) SQL과 같은 ORM 도구를 사용하여 Python에 내장 된 SQL과 프로그래밍 언어를 결합하면 작업을 단순화 할 수 있습니다. 3) 성능 최적화에는 인덱싱, 쿼리, 캐싱, 라이브러리 및 테이블 부서 및 거래 관리가 포함됩니다.

MySQL은 SQL 명령을 사용하여 데이터를 관리합니다. 1. 기본 명령에는 선택, 삽입, 업데이트 및 삭제가 포함됩니다. 2. 고급 사용에는 조인, 하위 쿼리 및 집계 함수가 포함됩니다. 3. 일반적인 오류에는 구문, 논리 및 성능 문제가 포함됩니다. 4. 최적화 팁에는 인덱스 사용, 선택*을 피하고 한계 사용이 포함됩니다.

MySQL은 데이터 저장 및 관리에 적합한 효율적인 관계형 데이터베이스 관리 시스템입니다. 장점에는 고성능 쿼리, 유연한 트랜잭션 처리 및 풍부한 데이터 유형이 포함됩니다. 실제 애플리케이션에서 MySQL은 종종 전자 상거래 플랫폼, 소셜 네트워크 및 컨텐츠 관리 시스템에서 사용되지만 성능 최적화, 데이터 보안 및 확장성에주의를 기울여야합니다.

SQL과 MySQL의 관계는 표준 언어와 특정 구현의 관계입니다. 1.SQL은 관계형 데이터베이스를 관리하고 운영하는 데 사용되는 표준 언어로, 데이터 추가, 삭제, 수정 및 쿼리를 허용합니다. 2.MySQL은 SQL을 운영 언어로 사용하고 효율적인 데이터 저장 및 관리를 제공하는 특정 데이터베이스 관리 시스템입니다.

InnoDB는 Redologs 및 Undologs를 사용하여 데이터 일관성과 신뢰성을 보장합니다. 1. Redologs는 사고 복구 및 거래 지속성을 보장하기 위해 데이터 페이지 수정을 기록합니다. 2. 결점은 원래 데이터 값을 기록하고 트랜잭션 롤백 및 MVCC를 지원합니다.

설명 명령에 대한 주요 메트릭에는 유형, 키, 행 및 추가가 포함됩니다. 1) 유형은 쿼리의 액세스 유형을 반영합니다. 값이 높을수록 Const와 같은 효율이 높아집니다. 2) 키는 사용 된 인덱스를 표시하고 NULL은 인덱스가 없음을 나타냅니다. 3) 행은 스캔 한 행의 수를 추정하여 쿼리 성능에 영향을 미칩니다. 4) Extra는 최적화해야한다는 Filesort 프롬프트 사용과 같은 추가 정보를 제공합니다.

Temporary를 사용하면 MySQL 쿼리에 임시 테이블을 생성해야 할 필요성이 있으며, 이는 별개의, 그룹 비 또는 비 인덱스 열을 사용하여 순서대로 발견됩니다. 인덱스 발생을 피하고 쿼리를 다시 작성하고 쿼리 성능을 향상시킬 수 있습니다. 구체적으로, 설명 출력에 사용되는 경우, MySQL은 쿼리를 처리하기 위해 임시 테이블을 만들어야 함을 의미합니다. 이것은 일반적으로 다음과 같은 경우에 발생합니다. 1) 별개 또는 그룹을 사용할 때 중복 제거 또는 그룹화; 2) OrderBy가 비 인덱스 열이 포함되어있을 때 정렬하십시오. 3) 복잡한 하위 쿼리 또는 조인 작업을 사용하십시오. 최적화 방법은 다음과 같습니다. 1) Orderby 및 GroupB


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

드림위버 CS6
시각적 웹 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
