1. 程式人生 > >Linux系統——MySQL基礎(一)

Linux系統——MySQL基礎(一)

# 資料庫
## 資料庫簡單的分類:
(1)關係型資料庫:MySQL和Oracle、Postgresql
(2)非關係型資料庫:Memcached和Redis
(3)訊息佇列中介軟體
(4)搜尋引擎資料庫:ElasticSearch
(5)時間序列資料庫:InfluxDB
(6)列資料庫:Hbase
(7)圖形資料庫:MongoDB

系型資料庫 SQL資料庫
資料和資料之間是有關係的,通過關係能夠將一系列資料都提取出來。關係型 資料庫可以通過一條資料關聯出一堆資料,如此一來,方便資料的檢索和查詢,提高開發人員的查詢效率,但是會拖累資料庫,因此關係型資料庫不支援太高併發。

非關係型資料庫 NoSQL資料庫(Not only SQL)
資料與資料之間是沒有關係的。

關係型資料庫MySQL和Oracle的區別
使用方式上沒有太多區別,都是就與SQL查詢方式的資料庫,但是Oracle是閉源的(收費),出現問題有人負責,運維人員不需要花費太多精力在Oracle中(在企業中學習)。
MySQL是開源的(免費),需要運維人員來維護,通常來說,真正的資料庫維護人員職位叫做DBA(database administrator),並非廣泛意義上的運維,只是資料庫專業運維。
MySQL資料庫最早是開源的,現在已近乾杯Oracle公司(SUN)收購了,為避免SUN公司對MySQL進行閉源操作,因此他們自主在MySQL最有y一個開源版本的基礎上,開發出來了一個分支資料庫,叫做MariaDB,關係型資料庫。其實他幾乎和MySQL一樣。


資料庫基本概念
(1)資料
以“記錄”形式統一的格式進行儲存
(2)表
將不同的記錄阻止在一起,形成了“表”,用來儲存具體資料
|姓名|基礎資訊表
|--|--|
| 小紅 |

|姓名|基礎成績表|
|--|--|
| 小紅 |
兩個資料庫的表中相同的欄位稱為主鍵(表中小紅就是主鍵)
(3)資料庫
表的集合,是儲存資料的倉庫
(4)資料庫管理系統(Database Management System DBMS)
實現對資料庫資源有效組織,管理和存取的系統軟體,具有以下功能:資料庫的建立和維護功能,資料定義功能,資料操縱功能,執行管理功能,通訊功能。
(5)資料庫系統(DBS)
是一個人—機系統,由硬體、作業系統、資料庫、DSMS、應用軟體和資料庫使用者組成。使用者可以通過DBMS操作資料庫,也可以通過應用程式操作資料庫

關係型資料系統是基於關係模型的資料庫系統,它的基本概念來自於關係模型。關係模型建立在關係代數的理論基礎上,資料結構使用簡單易懂的二位資料表,可以用簡單的“實體—關係“(E-R)圖來直接表示。E-R圖中包含了的實體(資料物件)、關係和屬性三個要素。

## MySQL資料庫介紹
### 特點
1. 效能更卓越、服務穩定
2. 開源、無版權限制、成本低
3. 多執行緒、多使用者
4. 基於C/S(Client/Server)架構
5. 安全可靠
== B/S(Web/Server):使用者通過web瀏覽器開啟輸入域名就能訪問伺服器Server的方式,使用者不需要安裝任何東西。==
==C/S(Client/Server):客戶端Client在使用者的電腦裡是需要下載並安裝的。 ==
## 編譯安裝MySQL
1. 準備工作
解除安裝rpm方式安裝的mysql-server、mysql

```
[[email protected] ~]# rpm -qa | grep mysql
mysql-libs-5.1.73-5.el6_6.x86_64
```

若存在,用rpm -e mysql-server mysql --nodeps命令解除安裝

安裝ncurses-devel 與cmake包

```
[[email protected] ~]# ls
anaconda-ks.cfg cmake-2.8.6.tar.gz install.log install.log.syslog mysql-5.5.22.tar.gz
[[email protected] cmake-2.8.6]# yum -y install gcc gcc-c++ make autoconf
[[email protected] ~]# yum -y install ncurses-devel
[[email protected] ~]# tar xf cmake-2.8.6.tar.gz -C /usr/src/
[[email protected] ~]# cd /usr/src/cmake-2.8.6/
[[email protected] cmake-2.8.6]# ./configure && gmake && gmake install
```

2. 原始碼編譯安裝
增加程式使用者mysql

```
[[email protected] ~]# useradd -M -s /sbin/nologin mysql
```

解壓 mysql-5.5.22.tar.gz

```
[[email protected] ~]# tar xf mysql-5.5.22.tar.gz -C /usr/src/
[[email protected] ~]# cd /usr/src/mysql-5.5.22/
```

cmake配置,編譯及安裝

```
[[email protected] mysql-5.5.22]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && make && make install
```

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql 主程式安裝目錄
-DSYSCONFDIR=/etc 配置檔案存放目錄
-DDEFAULT_CHARSET=utf8 預設字符集為中文
-DDEFAULT_COLLATION=utf8_general_ci 預設的字符集校對規則
-DWITH_EXTRA_CHARSETS=all 安裝所有字符集

3. 安裝後優化操作
修改MySQL安裝目錄的屬主與屬組

```
[[email protected] local]# chown -R mysql:root /usr/local/mysql/

```
檢視mysql下的目錄
bin命令目錄
data 資料目錄
support-files 提供了許多模板(啟動指令碼、配置檔案)
scripts 指令碼(負責MySQL初始化)

建立修改my.cnf配置檔案

```
[[email protected] local]# /bin/cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
# 使用cp的絕對路徑,強制覆蓋,無需提醒
```
my.cnf配置檔案相關介紹,在mysql解壓路徑support-files/下提供的模板:
my-huge.cnf 巨大資料量
my-innodb-heavy-4G.cnf innodb引擎
my-large.cnf 大資料量
my-medium.cnf 測試使用
my-small.cnf 小資料量

MySQL資料庫儲存引擎:
myisam
innodb

4. 新增系統服務

```
[[email protected] mysql-5.5.22]# /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[[email protected] local]# chmod +x /etc/init.d/mysqld
[[email protected] local]# chkconfig mysqld --add
[[email protected] local]# chkconfig mysqld --list
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off

```

5. 新增MySQL命令執行的路徑到PATH環境變數(或者建立該路徑的軟連結)

```
[[email protected] local]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[[email protected] local]# ./etc/profile
[[email protected] local]# echo $PATH

[[email protected] local]# ln -s /usr/local/mysql/bin/* /usr/local/bin/
```

6.執行mysql_install_db指令碼初始化資料庫
資料表以檔案的形式展現,每個小庫的庫名就是子目錄的名字,子目錄裡面裝著對應的資料檔案

```

[[email protected] local]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

```
--user=mysql 指定使用者身份
--basedir=/usr/local/mysql/ 指定安裝目錄(產品目錄)
--datadir=/usr/local/mysql/data/ 指定資料目錄

7. 啟動mysql服務,並檢視執行狀態

```
[[email protected] local]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
[[email protected] local]# netstat -antup | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1750/mysqld
```
== MySQL預設埠號3306 ==

8. mysql的連線並登入操作環境
mysql -u 指定使用者名稱
-p 指定密碼
-h 指定主機(遠端登入)
-P 指定埠

登入mysql

```
[[email protected] local]# mysql

[[email protected] local]# mysql -uroot -p

```

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181117001204243.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
退出登入
quit、exit 或 Ctrl+D

設定資料庫使用者名稱密碼
MySQL的賬號有兩部分組成:
賬戶名@登陸的IP地址
(遠端登入使用者名稱時,賬戶名和IP 地址均為遠端主機的使用者名稱和IP地址)

```
[[email protected] local]# mysqladmin -uroot password '123456'
[[email protected] local]# mysql -uroot -p123456 # 免互動式設定密碼
```

強力MySQL超級使用者的解決的方法
方法一:
1. 暫停mysql服務

```
[[email protected] ~]# /etc/init.d/mysqld stop

```

2. 跳過grant表授權,進入安全模式,並在後臺執行

```
[[email protected] ~]# mysqld_safe --skip-grant-tables &
[[email protected] ~]# jobs
[1]+ Running mysqld_safe --skip-grant-tables &


```

3. 進入安全模式修改密碼

```
[[email protected] ~]# mysql
mysql> use mysql
Database changed
mysql> update user set Password=password('123456')where user='root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 4 Changed: 3 Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

```

4. 重啟mysql服務,嘗試用新密碼登入

```
[[email protected] ~]# /etc/init.d/mysqld restart
Shutting down MySQL.181117 09:11:00 mysqld_safe mysqld from pid file /usr/local/mysql/data/localhost.localdomain.pid ended
SUCCESS!
Starting MySQL.. SUCCESS!
[1]+ Done mysqld_safe --skip-grant-tables
[[email protected] ~]# mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.22-log Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> quit
Bye

```

方法二:

```
[[email protected]t ~]# vim /etc/my.cnf
26 [mysqld]
27 port = 3306
28 socket = /tmp/mysql.sock
29 skip-external-locking
30 skip_grant_tables
31 key_buffer_size = 16M
[[email protected] ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
[[email protected] ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.22-log Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> update user set Password=password('123456')where user='root';
ERROR 1046 (3D000): No database selected
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

```
修改/etc/my.cnf配置檔案,把skip_grant_tables行刪掉,重啟MySQL服務

```
[[email protected] ~]# mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.22-log Source distribution


```
在MySQL資料庫中開啟使用tab鍵補全功能
1. 修改主配置檔案/etc/my.cnf

```
[[email protected] ~]# vim /etc/my.cnf
[mysql]
#no-auto-rehash
auto-rehash

```
2. 重啟mysql服務,登入測試

```
[[email protected] ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
[[email protected] ~]# mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.22-log Source distribution


```
3. 臨時支援tab鍵

```
[[email protected] ~]# mysql -uroot -p123456 --auto-rehash

```
使MySQL資料庫支援簡體中文
1. 臨時支援簡體中文

```
mysql> charset utf8;
```
2. 永久支援簡體中文(yum方式安裝的mysqld服務)

```
[[email protected] ~]# vim /etc/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[[email protected] ~]# /etc/init.d/mysqld restart
```

#### MySQL基礎命令
create、drop對庫和表進行操作
insert、updata、delete、select對錶裡資料進行操作(增刪改查)
==檢視資料庫列表資訊==

```
mysql> show databases;

```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181117100612855.)
==檢視資料庫中的資料表資訊(切換資料庫)==
use 資料庫名;
show tables;
```
mysql> use yunjisuan;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |

```
==顯示資料表的結構(欄位資訊)==
describe 空間名.表名;
desc 空間名.表名;

```
mysql> describe yunjisuan.users;
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| user_name | char(20) | NO | PRI | NULL | |
| user_passwd | char(30) | YES | | | |
+-------------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```

==create 建立新庫、建立新表==
格式:create database 資料庫名;
create table 表名(定義欄位);
```
mysql> create database yunjisuan;
#建立一個名為yunjisuan的資料庫
mysql> use yunjisuan;
#使用yunjisuan這個資料庫,將當前物件指定為yunjisuan這個庫
mysql> create table users (user_name char(20) not null, user_passwd char(30) default '', primary key(user_name));
#建立表users,並新增資訊,建立名為users的表,表內兩個欄位user_name和user_passwd,user_name 最多20個位元組 不能為空,user_passwd
最多30個位元組 預設為空,索引關鍵字(主鍵) user_name
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181117100457178.)
==drop 刪除庫、刪除表==
格式:drop table 空間名.表名;
drop database 資料庫名;


```
mysql> drop database yunjisuan;
#刪除一個叫做yunjisuan的庫
```

```
mysql> drop table yunjisuan.users;
#刪除一個yunjisuan庫的users表
```

==insert 插入新資料==
格式:insert into 空間名.表名 (欄位1,欄位2) values('值1','值2');
針對某個庫名、表名,把某個值插入某個欄位,必須一一對應
方法一:指定欄位
```
mysql> use yunjisuan;
Database changed
mysql> describe yunjisuan.users;
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| user_name | char(20) | NO | PRI | NULL | |
| user_passwd | char(30) | YES | | | |
+-------------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into users(user_name,user_passwd) value('daisy','123456');
mysql> insert into users (user_name,user_passwd) values('小花','123412');
mysql> insert into users(user_name) values('小然');


```
方法二:不指定欄位(有幾個欄位寫幾個值,對應插入到欄位內,不能少,可以指定空)

```
mysql> insert into users values('綠小花','123123');
mysql> select * from users;
+-----------+-------------+
| user_name | user_passwd |
+-----------+-------------+
| daisy | 123456 |
| 小然 | |
| 小花 | 123412 |
| 綠小花 | 123123 |
+-----------+-------------+
4 rows in set (0.00 sec)

```
==update 更新資料==
格式:update 空間名.表名 set 欄位名='值' where 對應行的欄位名='值';

```
mysql> select * from users;
+-----------+-------------+
| user_name | user_passwd |
+-----------+-------------+
| daisy | 123456 |
| 小然 | |
| 小花 | 123412 |
| 綠小花 | 123123 |
+-----------+-------------+
4 rows in set (0.00 sec)

mysql> update yunjisuan.users set user_passwd ='533223' where user_name='小然';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from users;
+-----------+-------------+
| user_name | user_passwd |
+-----------+-------------+
| daisy | 123456 |
| 小然 | 533223 |
| 小花 | 123412 |
| 綠小花 | 123123 |
+-----------+-------------+
4 rows in set (0.00 sec)

```
==對賬戶設定加密密碼==

```
mysql> update yunjisuan.users set user_passwd =password('533223') where user_name='小然';
```
多個條件,並且“and”,或者“or”,不等於“!=”,
==delete 刪除不需要的資料==
格式:delete 空間名.表名 where 欄位1='值1';

```
mysql> delete from yunjisuan.users where user_name='小花';
Query OK, 1 row affected (0.00 sec)

mysql> select * from users;
+-----------+-------------+
| user_name | user_passwd |
+-----------+-------------+
| daisy | 123456 |
| 小然 | 533223 |
| 綠小花 | 123123 |
+-----------+-------------+
3 rows in set (0.00 sec)

```
==select 檢視資料==
格式:select 欄位名 from 空間名.表名;
select 欄位名 from 空間名.表名 where 條件表示式;
(空間名就是小庫名 *代表所有欄位)

檢視mysql.user表裡的user,host,password欄位的所有資料

```
mysql> select user,host,password from mysql.user;
```
將橫向顯示變為縱向\G

```
mysql> select * from mysql.user\G
```
檢視yunjisuan.users表裡的所有資訊

```
mysql> select * from yunjisuan.users;
+-----------+-------------+
| user_name | user_passwd |
+-----------+-------------+
| daisy | 123456 |
| 小然 | 533223 |
| 綠小花 | 123123 |
+-----------+-------------+
3 rows in set (0.00 sec)

```

檢視yunjisuan.users表裡的user_name的資訊

```
mysql> select user_name from yunjisuan.users;
+-----------+
| user_name |
+-----------+
| daisy |
| 小然 |
| 綠小花 |
+-----------+
3 rows in set (0.00 sec)

```
檢視yunjisuan.users表裡的user_name為daisy的所有資訊

```
mysql> select * from yunjisuan.users where user_name='daisy';
+-----------+-------------+
| user_name | user_passwd |
+-----------+-------------+
| daisy | 123456 |
+-----------+-------------+
1 row in set (0.00 sec)


```
==新增列、刪除列==
刪除列, 以下兩種方式都可以
alter table 表名 drop column 刪除的列名;
alter table 表名 drop 刪除的列名;

新增列,必須指定列的型別
alter table 表名 add 列名 varchar(10);

==grand 使用者許可權設定==
1. 設定使用者許可權(使用者不存在時,則新建使用者)

```
mysql> grant all on *.* to 'yunjisuan'@'192.168.214.149' identified by '123456';
mysql> grant select on mysql.user to 'daisy'@'192.168.214.150' identified by '123456';

```

grant all on 授予所有許可權(select、delete、update、insert等)
all指檢視的型別;
第一個*是指所有的資料庫;
第二個是指所有的表
'root'@'192.168.124.234' 賬號
123456 密碼
grand 建立在server端
MySQL的client需要安裝mysql安裝包(包為mysql,用於客戶端的安裝)

排錯:
```
mysql> grant all on *.* to 'yunjisuan'@'192.168.214.149' identified by '123456';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to 'yunjisuan'@'192.168.214.149' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+-----------+-----------------------+
| user | host |
+-----------+-----------------------+
| root | 127.0.0.1 |
| yunjisuan | 192.168.214.149 |
| root | ::1 |
| | localhost |
| root | localhost |
| | localhost.localdomain |
| root | localhost.localdomain |
+-----------+-----------------------+
7 rows in set (0.00 sec)


```
==檢視使用者許可權==

```
mysql> show grants;
mysql> show grants for 'daisy'@'192.168.214.150';
mysql> show grants for 'root'@'localhost';

```
遠端登入 'daisy'@'192.168.214.150'賬戶

```
[[email protected] ~]# mysql -u daisy -p 123456 -h192.168.214.150;
```

==撤銷使用者許可權==

```
mysql> mysql> revoke select on mysql.user from 'daisy'@'192.168.214.150';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


```
MySQL萬用字元:
_ 任意單個字元
% 任意長度的任意字元

```
mysql> grant select on *.* to 'daisy'@'%' identified by '123456';
mysql> flush privileges;

```
==顯示廣泛的伺服器狀態資訊==
show status;

==顯示建立特定資料庫或表==
help create database;
help create tables;

==顯示授權使用者的安全許可權==
show grants;

==顯示伺服器錯誤或警告資訊==
show errors;
show warnings;

==顯示當前連線使用者==
mysql> select user();

==顯示當前時間==
mysql> select now();

==顯示當前使用者及時間==
mysql> select user(),now();
mysql> select CURRENT_USER(),CURRENT_TIMESTAMP;

==顯示當前資料庫==
mysql> select database();

==顯示伺服器狀態==
mysql> status;

==資料庫的備份與恢復==
1. 可直接備份目錄 /var/local/mysql/var
2. 使用專用備份工具 mysqldump

==備份操作==
mysqldump -u 使用者名稱 -p 密碼 選項 空間名 表名 > /備份路徑/備份檔名
常見選項:
-all-databases
--opt

```
[[email protected] ~]# mysqldump -u root -p mysql user > mysql-user.sql
Enter password:
[[email protected] ~]# mysqldump -u root -p --databases daisy > daisy.sql
Enter password:
[[email protected] ~]# mysqldump -u root -p --opt --all-databases > all-data.sql
Enter password:
```
恢復操作
mysql -u root -p 空間名 < /備份路徑/備份檔名

```
[[email protected] ~]# mysql -u root -p daisy < mysql-user.sql
Enter password:
```
## 資料庫索引

1. 資料庫索引
在資料庫中,索引使資料庫程式無需對整個表進行掃描,就可可以在其中找到所有資料。資料庫的索引是某個表中一列或者若干列值的集合,以及物理標識這些值的資料頁的邏輯指標清單。
2. 作用
(1)設定了合適的索引之後,資料庫利用各種快速的定位技術,能夠大大加快查詢速率,特別是當表很大時,或者查詢涉及到多個表時,使用索引可是查詢加快成千倍。
(2)可以降低資料庫的IO成本,並且索引還可以降低資料庫的排序成本。
(3)通過建立唯一性索引保證資料表資料的唯一性,可以加快表與表之間的連線。
(4)在使用分組和排序時,可大大減少分組和排序時間。
4. 分類
(1)普通索引
這是最基本的索引型別,而且沒有唯一性之類的限制
(2)唯一性索引
與普通索引基本相同,區別於:索引列的所有值都只能出現一次,即必須唯一,但可以為空。
(3)主鍵
是一種特殊的唯一索引,必須指定為“PRIMARY KEY”,既有唯一性的同時不能為空
(4)全文索引
在MySQL中,全文索引的型別為FULLTEXT,全文索引可以在VARCHAR或者TEXT型別的列上建立。貼吧的文字內容,和一些小型的網站網頁內容,存放在資料庫中即為全文索引模式。
(5)單列索引與多列索引
索引可以是單列上建立的索引,也可以是多列上建立的索引。
==建立普通索引==
格式:create index <索引的名字> on 表名(欄位);

```
mysql> create index salary/-index on IT_salary(薪資);

```

==建立唯一性索引==
格式:create unique index <索引的名字> on 表名(欄位);

```
mysql> create unique index salary/-index on IT_salary(薪資);

```
==建立主鍵索引==
格式:create table 表名([...],primary key(欄位));
若在新建表時忘記建立主鍵,使用如下命令:
alter table 表名 add primary key(欄位));
```
mysql> create table users (user_name char(20) not null, user_passwd char(30) default '', primary key(user_name));
#建立表users,並新增資訊,建立名為users的表,表內兩個欄位user_name和user_passwd,user_name 最多20個位元組 不能為空,user_passwd
最多30個位元組 預設為空,索引關鍵字(主鍵)

```
==檢視索引資訊==
格式: show index from 表名;
show key from 表名;
```
mysql> show index from IT_salary \G;

mysql> show key from IT_salary \G;

```
==刪除索引==
格式:drop index <索引的名字> on 表名;
alter table 表名 drop index <索引的名字>;
alter table 表名 drop primary key;
```
mysql> drop index salary/-index on IT_salary;

```
### 事務
1. 事務時一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫要麼都執行,要麼不都執行。
事務是一個不可分割的工作邏輯單元,在資料庫系統上執行併發操作時,事務時最小的控制單元。
事務適合於多使用者同時操作的資料庫系統的場景,如銀行、保險公司及證券交易系統等等。
2. 事務的ACID特點
事務既有四個屬性:ACID
(1)原子性(Atomicity)
事務是一個完整的操作,事務的各元素是不可分的(原子的),事務的所有元素必須做為一個整體提交或回滾。如果事務中的任何元素失敗,則整個事務將失敗。
(2)一致性 (Consistency)
當事務完成時,資料必須處於一致狀態:在事務開始之前,資料庫彙總儲存的資料處於一致狀態;在正在進行的事務中,資料可能處於不一致的狀態;當事務完成時,資料必須再次回到一致的一致狀態。
(3)隔離性(Isolation)
對資料進行修改的所有併發事務是彼此隔離的,這表明事務必須是獨立的,它不應該以任何方式依賴於或影響其他事務。修改資料的事務可以在另一個使用相同資料的事務開始之前訪問這些資料,或者在另一個使用相同資料的事務結束之後訪問這些資料。
(4)永續性(Durability)
事務的永續性指不管系統是否發生了故障,事務處理的結果都是永久的。一旦事務被提交,事物的效果會被永久地保留在資料庫中。
==事務處理命令==
begin 開始一個事務(互動式資料存在記憶體裡)
commit 提交一個事務(在記憶體的資料提交到硬碟,非互動式能顯示資料)
rollback 回滾一個事務(撤銷),從begin開始的所有命令都被撤銷(將在記憶體中的資料返回到源位置,不顯示在硬碟,結束事務)

互動式命令保留在記憶體裡,未寫入硬碟可以撤銷,等待事務
非互動式命令保留在硬盤裡

==檢視系統內變數autocommit的資訊==

```
mysql> show variables like ‘autocommit’;
```
關閉後臺提交,禁止自動提交(臨時生效)

```
mysql> set autocommit=0;
```
開啟自動提交(臨時生效)

```
mysql> set autocommit=1;
```
### MySQL資料庫儲存引擎
##### 儲存引擎概念介紹
MySQL中的資料用各種不同的技術儲存在檔案系統中,每一種技術都是用不同的儲存機制、索引技巧,鎖定水平並最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱為儲存引擎。
儲存引擎就是MySQL將資料存出在檔案系統中的儲存方式或者儲存格式
目前MySQL常用的兩種儲存引擎:MyISAM、InnoDB
MySQL儲存引擎是MySQL資料庫伺服器中的元件,負責為資料庫執行實際的資料I/O操作,使用特殊儲存引擎的主要優點之一在於,僅需提供特殊應用所需要的特性,資料庫中的系統開銷較小,具有更有效和更高的資料庫效能。
MySQL系統中,儲存引擎處於檔案系統之上,在資料儲存到資料檔案之前會傳輸到儲存引擎,之後按照各個儲存引擎的儲存格式進行儲存。
#### MyISAM介紹
1. MyISAM的概述
MyISAM儲存引擎是MySQL關係資料庫系統5.5版本之前預設的儲存引擎,前身是ISAM。
ISAM是一個定義明確且精力時間考驗的資料表格管理方法,在設計只是就考慮到資料庫被查詢的次數要遠大於更新的次數。
ISAM的特點:ISAM執行讀取操作的速度很快,而且佔用不大量的記憶體和儲存資源,它不支援事無出路,不能夠容錯。
MyISAM管理非事務表,是ISAM的擴充套件格式,提供ISAM裡所沒有的索引和欄位管理的大量功能。
MyISAM使用一種表格鎖定的機制,已優化多個併發的讀寫操作。MyISAM提供高速儲存和檢索,以及全文搜尋能力,受到web開發的青睞。
2. MyISAM的特點(==讀取資料,對伺服器資源佔用低==)
(1)==不支援事務==(不支援複雜功能)
(2)==表級鎖定形式==,資料在更新時鎖定整個表(一旦寫入資料,引擎直接對資料表進行表級鎖定,其他使用者不能再寫也不能再讀,==不支援併發寫==)(==讀支援好==)
(3)資料庫在讀寫過程中相互阻塞(讀的時候不能寫)
(4)可以通過key_buffer_size來設定(寫)==快取索引==,提高訪問效能,減少磁碟IO的壓力,但快取只會快取索引檔案,==不會快取資料==(可以快取索引,但是不快取資料,記憶體佔用小)
(5)採用MyISAM儲存引擎資料單獨寫入或讀取,速度過程較快而且佔用資源相對較少。
(6)MyISAM儲存引擎不支援外來鍵約束,只支援全文索引
(7)每個MyISAM在磁碟上儲存成三個檔案,每一個檔案的名字以表的名字開始,副檔名指出檔案型別。
.frm 檔案儲存表定義
.MYD 檔案儲存資料(MYData)
.MYI 檔案儲存索引檔案(MYIndex)
3. MyISAM使用的生成場景
(1)公司業務不需要事務支援
(2)一旦單方讀取資料比較多的業務,或單方面寫入資料較多的業務,如:www.blog,圖片資訊資料庫,使用者資料庫,商品庫等業務,MyISAM儲存引擎讀寫都比較頻繁的場景不合適。
(3)對資料業務一致性要求不是非常高的業務
(4)使用讀寫併發訪問相對較低的業務
(5)資料修改相對較少的業務
(6)伺服器硬體資源相對比較差
#### InnoDB介紹
1. InnoDB的特點(==寫入資料,對伺服器資源佔用高==)
(1)==支援事務==:支援4個事務隔離級別
(2)==寫入資料行級鎖定==,但是全表掃描仍然會是表級鎖定,單表可以==支援併發寫==(寫支援好)
(3)讀寫阻塞與事務隔離級別相關
(4)既有非常高效的快取特性:==能快取索引,也能快取資料==(佔用記憶體大,對伺服器要求高)
(5)表與主鍵以簇的方式儲存
(6)支援分割槽、表空間,類似Oracle資料庫
(7)支援外檢約束,5.5以前不支援全文索引,5.5版本以後指出全文索引
(8)對硬體資源要求比較高
2. InnoDB使用的生成場景
(1)業務要求事務的支援
(2)行級鎖定對高併發有很好的適應能力,但需要確保查詢是通過索引來完成
(3)業務資料更新較為頻繁的場景,如:論壇,微博
(4)業務資料一致性要求較高,如:銀行業務
(5)硬體裝置記憶體較大,利用InnoDB較好的快取能力來提高記憶體利用率,減少磁碟IO的壓力。
==主從架構:從資料庫:MyISAM可以用來讀,主資料庫:InnoDB也已用來寫==
#### 企業選擇儲存引擎的依據
1. 需要考慮每個儲存引擎提供了哪些不同的核心功能及應用場景
2. 支援的欄位和資料型別
所有引擎都支援通用的資料型別,但不是所有引擎都支援其他的欄位型別,如二進位制物件。
3. 鎖定型別:不同的村粗引擎指出不同級別的鎖定
表鎖定:MyISAM、MEMORY
行鎖定:InnoDB
頁鎖定:BDB
4. 索引的支援
建立索引在搜尋和恢復資料庫中的資料的時候能顯著提高效能
不同的儲存引擎提供不同的製作索引的技術
有些儲存引擎根本不支援索引
5. 事務處理的支援
事務處理功能通過提供在向表中更新和插入資訊期間的可靠性
可根據企業業務是否要支援事務選擇儲存引擎
#### 配置合適的儲存引擎
==檢視資料庫可配置的儲存引擎==

```
mysql> show engines;
+--------------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+--------------------+---------+------------------------------------------------------------+--------------+------+------------+
6 rows in set (0.00 sec)

```
==查看錶正在使用的儲存引擎==
(1)檢視當前MySQL的預設引擎
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181121165833715.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
(2)查看錶使用的儲存引擎
方法一:show table status from 庫名 where name='表名';

```
mysql> show table status from yunjisuan where name='users'\G;
*************************** 1. row ***************************
Name: users
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 3
Avg_row_length: 5461
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 9437184
Auto_increment: NULL
Create_time: 2018-11-19 14:15:01
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
# 非系統使用者的表的引擎為InnoDB
mysql> show table status from mysql where name='user'\G;
*************************** 1. row ***************************
Name: user
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 11
Avg_row_length: 92
Data_length: 1012
Max_data_length: 281474976710655
Index_length: 2048
Data_free: 0
Auto_increment: NULL
Create_time: 2018-11-19 14:15:01
Update_time: 2018-11-19 14:15:01
Check_time: NULL
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment: Users and global privileges
1 row in set (0.00 sec)
# MySQL系統表mysql.user的引擎為MyISAM引擎
```
方法二:show create table 表名;
(檢視建表時的命令)

```
mysql> show create table yunjisuan.users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`user_name` char(20) NOT NULL,
`user_passwd` char(30) DEFAULT '',
PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


```
3. 配置儲存引擎為所選擇的型別
方法一:alter table 表名 engine=引擎;

```
mysql> alter table yunjisuan.users engine=myisam;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> show create table yunjisuan.users \G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`user_name` char(20) NOT NULL,
`user_passwd` char(30) DEFAULT '',
PRIMARY KEY (`user_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

```
方法二:修改my.cnf的default-storage-engine為引擎

```
[[email protected] ~]# vim /etc/my.cnf
[mysql]
#no-auto-rehash
auto-rehash
default-storage-engine = InnoDB
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[[email protected] ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
[[email protected] ~]# mysql -uroot -p123456 -e 'show engines\G;'

```
方法三:create table 建立表時使用 engine=引擎

```
mysql> create table daisy(id int) engine=myisam;
mysql> show create table yunjisuan.daisy;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------+
| daisy | CREATE TABLE `daisy` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

```
方法四:mysql_convert_table_format --user=root --password=密碼 --sock=檔案路徑/mysql.sock --engine=引擎 空間名 表名
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181121172841486.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)
### MMM實現MySQL高可用
#### MMM介紹
MMM(Masterr-Master Replication Manager for MySQL)MySQL主主複製管理器。MMM是一套靈活的指令碼程式,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master複製的配置(同一時間只有一個節點時可寫的)
MMM的監管端是會人提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP,通過監管的管理。這些IP會繫結在可用mysql之上,當某一臺mysql宕機時,會將VIP遷移至其他mysql。
mmm_mond:監控程序,負責所有的監控工作,決定和處理所有節點角色活動。因此指令碼需要在監管機上執行。
mmm_agentd:執行在每個mysql故武器上的代理程序,完成監控的探針工作和執行簡單的遠端服務設定。此指令碼需要在被監管機上執行。
mmm_control:一個簡單的指令碼,提供管理mmm_mond程序的命令。