CentOS下MySQL數據庫經常使用命令總結 (資源)

MySQL分支

Percona和MariaDB

MySQL查詢過程

注意 : 在進行 MySQL 的優化以前必需要了解的就是 MySQL 的查詢過程;html

       MySQL數據庫放在WEB網站後端數據存儲,數據庫通常用於持久化數據,存儲內存或者硬盤上,主要存儲在硬盤中。前端

       MySQL主從複製構架根本目標保證網站高可用,當master宕機,可以快速切換到slave庫;java

       MySQL主從複製最大用途爲了保證主庫和從庫數據的完整性,保證數據同步。node

        MySQL主從同步是異步複製過程,中間同步數據會有延遲,整個過程開啓三個線程,分別是master開啓IO線程 ,Slave開啓IO 和 SQL線程。mysql

      還須要在Master上開啓bin-log功能,是主從複製最核心組件,二進制日誌文件,文件會記錄數據庫中增、刪、改、插入的SQL語句。ios

        從庫就能夠基於master端bin-log日誌來同步數據,讀取bing-log日誌來同步數據,讀取bin-log日誌文件中SQL語句,而且把SQL語句放在本地去執行。web

       Slave庫經過I/O線程鏈接Master,發起數據請求,請求從指定bin-log文件、位置點以後的SQL語句。面試

        Master數據庫收到Slave的請求(指定bin-log文件名、position點以後的內容),以IO線程響應,命令行show processlist查看 , 在master端看到的bin-log dump 線程,將bin-log日誌指定位置點的SQL內容dump出來,發送給Slave數據庫服務器;sql

      當Slave庫收到bin-log日誌內容以後,將信息追加存儲到Relay-log中繼日誌,同時會生成master.info文件(記錄master端IP、用戶名、密碼、bin-log文件名、Position點);mongodb

       Slave數據庫服務器實時啓動SQL線程,SQL線程檢測relay-log日誌中是否有更新,內容有更新的話,解析日誌中SQL語句,而且在本地數據庫中執行;

      SQL線程執行玩SQL語句,那就保證了Slave庫和Master數據一致,從而實現主從數據同步 ,執行完的效果,Slave庫Master數據保存一致;

Mariadb Bin-log功能

1)Bin-log文件是一個二進制文件,二進制文件,不能直接打開;

2)主要用於存儲數據庫事務操做的,存儲在數據庫中各個操做 (增、刪、改、插入);      

3)若是開啓bin-log日誌功能以後,bin-log文件記錄在數據庫中各類修改操做的SQL語句。

4)基於bin-log文件,實現數據庫數據增量備份、完整備份,軍科院從而基於該備份實現數據還原;

5)Bin-log日誌實現MYSQL主從複製,主從複製,Slave端來獲取數據,實際上是獲取bin-log日誌中的數據;

 

MySQL默認配置文件路徑:
配置文件:/etc/my.cnf
日誌文件:/var/log//var/log/mysqld.log
服務啓動腳本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

 

MySQL主從同步、半同步、主主同步、全同步

1)MySQL主從同步是5.5以前的版本默認數據同步方式;

2)從MySQL5.5以後,MySQL數據同步開始引入半同步;

3)MySQL5.7.4之後,對MySQL半同步進一步優化,引入多線程實現數據更高效的傳輸;

4)MySQL心版本支持全同步,Group同步,普及難度高;

 

        經常使用的關係型數據庫軟件 :MySQL、mariadb、Oracle、SQL Server、PostgreSQL、DB2等;

         注意 :MyisamMYSQL5.5以前默認引擎,不支持事務、不支持外部鍵、表鎖、應用於大量的select,查詢比較多。 MySQL5.5之後不支持./configure編譯,使用cmake編譯。

         MySQL引擎 : MyISAM、InnoDB、memory、CSV。

       MyISAM類型的數據庫表強調的是性能,其執行速度比InnoDB類型更快,但不提供事務支持,不支持外鍵,若是執行大量的SELECT(查詢)操做 , MyISAM是更好的選擇,支持表鎖;

      InnoDB提供事務支持事務、外部鍵、行級鎖等高級數據庫功能,執行大量的INSERT或UPDATE,處於性能方面的考慮,能夠考慮使用InnoDB引擎;

RDBMS(關係數據庫管理系統)數據庫的特色以下 :

一、數據以表格的形式出現;

二、每行記錄數據的真實內容;

三、每列記錄數據真實內容的數據域;

四、無數的行和列組成一張表;

五、若干的表組成一個數據庫;

 

MySQL主從原理解析 :

1)MySQL主從是異步複製過程,整個過程選喲開啓三個線程,分別是Master開啓I/O線程 ,Slave開啓I/O和SQL線程,同時master必須開啓bin-log日誌功能。

2)第一次salve start : 以IO線程經過受權用戶名和密碼鏈接Master,說請求某個bin-log某個position點以後的內容,master收到請求以後;

3)Master會經過I/O線程bin-log內容返給slave IO線程,Slave服務器收到bin-log文件中的內容以後,存放在本地的relay-log日誌中,同行會產生一個master.info文件(存放bin-log文件名稱、用戶名、密碼明文、最後position點)方便下次同步讀取配置信息;

4)Slave端有一個SQL線程,SQL線程實時運行,監測relay-log日誌文件是否更新,若是有更新的話,就把內容解析成SQL語句。

5)解析成SQL語句,會在本地去執行,執行完的效果保持數據同步。

 

MySQL數據庫常見索引類型 :普通索引(normal)、惟一索引(unique)、全文索引(full text)、主鍵索引(primary key)、組合索引等,以下爲每一個索引的應用場景及區別:

普通索引:normal,使用最普遍;

惟一索引:unique,不容許重複的索引,容許有空值;

全文索引:ful text ,只能用於MyISAM表,FULLTEXT主要用於大量的內容檢索;

主鍵索引: primary key 又稱爲特殊的惟一索引,不容許有空值;

組合索引:爲提升mysql效率可創建組合索引;

 

MySQL數據庫在存儲數據時,默認編碼latin1,存儲中文字符時,在顯示或者WEB調用時會顯示亂碼,爲解決該亂碼問題,在相應段中加入相應的參數 :

一、編譯vim /etc/my.cnf配置文件,在相應段中加入相應的參數:

[client]字段里加入 : default-character-set=utf8

[mysqld]字段里加入 : character-set-server=utf8

[mysql]字段里加入  :default-character-set=utf8

字符集修改完畢,重啓MySQL服務,便可;

二、MySQL命令行中運行以下指令,

show variables like '%char%';

SET charracter_set_client = utf8;

SET charracter_set_results = utf8;

MySQL數據庫表建立各個索引命令,以t1爲案例。

主鍵索引 :ALTER TABLE t1 ADD PRIMARY KEY ('column');

惟一索引 :ALTER TABLE t1 ADD UNIQUE ('column');

普通索引 :ALTER TABLE t1 ADD INDEX index_name ('column');

全文索引 : ALTER TABLE t1 ADD FULLTEXT ('column');

組合索引 : ALTER TABLE t1 ADD INDEX index_name ('column1','column2','column3',);

MySQL建立用戶及受權

grant all on jfedu.* to test@localhost identified by 'pass';      #受權localhost主機經過test用戶和pas密碼訪問本地的jfedu庫的全部權限;

grantselect,insert,update,delete on *.* to test@"%" identified by 'pass';    #受權全部主機經過test用戶和pass密碼訪問本地的jfedu庫查詢、插入、更新、刪除權限;

grant all on jfedu.* to test@'192.168.111.118' identified by 'pass';    #受權192.168.111.118主機經過test用戶和pass密碼訪問本地jfedu庫的全部權限;

 

MySQL數據庫表刪除各個索引命令,以t1表爲案例

DROP INDEX index_name ON t1;

ALTER TABLE t1 DROP INDEX index_name;

ALTER TABLE t1 DROP PRIMARY KEY;

MySQL數據庫查看錶索引:

show index from t1;

show keys from t1;

MySQL數據庫索引的缺點 : 

一、MySQL數據庫索引雖然可以提升數據庫查詢速度,但同時會下降更新、刪除、插入表的速度,例如如對錶進行INSERT、UPDATE、DELETE時,update表MySQL不只要保存數據,還須要保存更新索引;

二、創建索引會佔用磁盤空間,大表上創建了多種組合索引,索引文件的會佔用大量的空間。

MySQL數據庫慢查詢

       MySQL數據庫慢查詢主要用於追蹤異常的SQL語句,能夠分析出當前程序裏那些SQL語句比較耗費資源,慢查詢日誌則用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過long_query_time值的SQL語句,會被記錄到慢查詢日誌中。

       MySQL數據庫默認沒有開啓慢查詢日誌功能,需手動在配置文件或者MySQL命令行中開啓,慢查詢日誌默認寫入磁盤中的文件,也能夠將慢查詢日誌寫入到數據庫表:

查看數據庫是否開啓查詢

show variables like '%slow%';

show variables like '%long_query%';

MySQL慢查詢參數詳解以下 :

log_slow_queries                      關閉慢查詢日誌功能

log_query_time                        #慢查詢超時間,默認爲10s;MySQL5.5以上能夠設置微秒;

slow_query_log_file                          #  關閉慢查詢日誌;

slow_launch_time                             #Thread create時間,單位秒,若是thread crete 的時間超過了這個值,該變量slow_launch_time的值會加1;

log-queries-using-indexes       記錄來添加索引的SQL語句

開啓MySQL慢查詢日誌方法有兩種 :

(1)、mysql數據庫命令執行命令: 

set global slow_query_logon;

show variables liek '%slow%';

(2)、編輯my.cnf配置文件中添加瑞小安代碼:

log-slow-queries = /data/mysql/localhos.log;

long_query_time = 0.01

log-queries-not-using-indexes

慢查詢功能開啓以後,數據庫會自動將執行時間超過設定時間的SQL語句添加至慢查詢日誌文件中,能夠提供慢查詢日誌文件定位執行慢的SQL,從而對其優化,能夠經過msyqldumpslow命令行工具分析日誌,相關參數以下:

執行命令mysqldumpslow -h 能夠查看命令幫助信息:

MySQL數據庫優化

       MySQL數據庫優化是一項很是重要的工做,並且是一項長期的工做,MySQL優化三分靠配置文件及硬件資源的優化,七分靠SQL語句的優化。

       MySQL數據庫集體優化包括 : 配置文件的優化、sql語句的優化、表結構的優化、索引的優化, 而配置的優化包括 :系統內核優化、硬件資源、內存、CPU、mysql自己配置文件的優化、

      硬件上的優化 :增長內存和提升磁盤讀寫速度,均可以提升mysql數據庫的查詢,更新的速度,另外一種提升MySQL性能的方式是使用多塊磁盤類存儲數據,由於能夠從多看磁盤上並行讀取數據,這樣能夠提升數據的速度。

     MySQL參數的優化 : 內存中會爲mysql保留部分的緩衝區,這些緩衝區能夠提升MySQL的速度,緩衝區的大小能夠在MySQL的配置文件中進行設置。

     附企業級MySQL百萬量真實環境配置my.cnf內容,能夠根據實際清空修改 :

[client]

port = 3306

socket = /tmp/mysql.sock

[mysqld]

user =mysql

server_id = 10

port = 3306

socket = /tmp/mysql.sock

datadir = /data/mysql

old_passwords = 1

lower_case_table_names =1

character-set-server = utf8

default-storage-engine = MYISAM

log-bin = bin.log

log-error = error.log

 

slow_query_log_file = slow.log

binlog_cache_size = 4M

binglog_format = mixed

max_lbinlog_cache_size = 16M

max_binlog_size = 1G

expire_logs_days = 30

ft_min_word_len = 4

back_log = 512

max_allowed_packet = 64M

max_connections = 4096

max_connect_errors = 100

join_buffer_size = 2M

read_buffer_size = 2M

sort_buffer_size =2M

query_cache_size = 64M

table_open_cache = 10000

thread_cache_size = 256

max_heap_table_size = 64M

tmp_table_size = 64M

thread_stack =192K

thread_concurrency = 24

local-infile =0

skip-show-database

skip-name-resolve

skip-external-locking

 

 

MySQL日誌文件系統的組成 : 
            a、錯誤日誌:記錄啓動、運行或中止mysqld時出現的問題。
            b、通用日誌:記錄創建的客戶端鏈接和執行的語句。
            c、更新日誌:記錄更改數據的語句。該日誌在MySQL 5.1中已再也不使用。
            d、二進制日誌:記錄全部更改數據的語句。還用於複製。
            e、慢查詢日誌:記錄全部執行時間超過long_query_time秒的全部查詢或不使用索引的查詢。
            f、Innodb日誌:innodb redo log。

             Innodb 四大 IO 線程:write thread,read thread,insert buffer thread,redo log thread

             master thread 是數據庫的主線程,優先級別最高,裏面包含 1s 和 10s 對數據庫的操做。

              page cleaner thread:幫助刷新髒頁的線程,5.7 版本能夠增長多個。

              purge thread :刪除無用 undo 頁。默認1個,最大能夠調整到 32。

        針對 Innodb 存儲引擎的三大特性有:兩次寫,自適應哈希索引,插入緩衝;

        MySQL中有六種日誌文件,分別是:重作日誌(redo log)、回滾日誌(undo log)、二進制日誌(binlog)、錯誤日誌(errorlog)、慢查詢日誌(slow query log)、通常查詢日誌(general log),中繼日誌(relay log)。

       重作日誌有一個緩存區Innodb_log_buffer,Innodb_log_buffer的默認大小爲8M(這裏設置的16M),Innodb存儲引擎先將重作日誌寫入innodb_log_buffer中。使用show variables like 'innodb_log_buffer_size';命令;

經過一條 sql 語句進入數據庫的過程:

 

數據庫有兩種類型:

  • (1)關係型數據庫; 好比,Mysql ,oracle ,Sybase ,Sql server。

  • (2)非關係型數據庫:好比,MongoDB ,   Nosql  以文檔形式進行存儲,bson格式

注意 :在 MySQL 8.0 中, 默認的密碼加密方式是 SHA2 。

經過如下三種方式將innodb日誌緩衝區的日誌刷新到磁盤

1,Master Thread 每秒一次執行刷新Innodb_log_buffer到重作日誌文件。

2,每一個事務提交時會將重作日誌刷新到重作日誌文件。

3,當重作日誌緩存可用空間 少於一半時,重作日誌緩存被刷新到重作日誌文件

由此能夠看出,重作日誌經過不止一種方式寫入到磁盤,尤爲是對於第一種方式,Innodb_log_buffer到重作日誌文件是Master Thread線程的定時任務。


   缺省狀況下,全部日誌建立於mysqld數據目錄中。
   能夠經過刷新日誌,來強制mysqld來關閉和從新打開日誌文件(或者在某些狀況下切換到一個新的日誌)。
   當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,則日誌被老化。
   對於存在MySQL複製的情形下,從複製服務器將維護更多日誌文件,被稱爲接替日誌。

數據庫優化維度有四個:硬件、系統配置、數據庫表結構、SQL及索引

優化選擇

  • 優化成本:硬件>系統配置>數據庫表結構>SQL及索引

  • 優化效果:硬件<系統配置<數據庫表結構<SQL及索引

優化工具

數據庫層面

檢查問題經常使用工具​​​​​

mysqlmsyqladmin                                 mysql客戶端,可進行管理操做mysqlshow                                  功能強大的查看shell命令show [SESSION | GLOBAL] variables          查看數據庫參數信息SHOW [SESSION | GLOBAL] STATUS             查看數據庫的狀態信息information_schema                         獲取元數據的方法SHOW ENGINE INNODB STATUS                  Innodb引擎的全部狀態SHOW PROCESSLIST                           查看當前全部鏈接session狀態explain                                    獲取查詢語句的執行計劃show index                                 查看錶的索引信息
show index from t;                      #查看t表的索引​​​slow-log                                   記錄慢查詢語句mysqldumpslow                              分析slowlog文件的

不經常使用但好用的工具

zabbix                           監控主機、系統、數據庫(部署zabbix監控平臺)pt-query-digest                  分析慢日誌mysqlslap                        分析慢日誌sysbench                         壓力測試工具mysql profiling                  統計數據庫總體狀態工具Performance Schema               mysql性能狀態統計的數據workbench                        管理、備份、監控、分析、優化工具(比較費資源)

 

數據庫基礎操做

    一、遠程        mysql -u 用戶名 -p密碼 等其餘參數

                        退出 :quit;    、 exit ;

    二、基礎操做  建立數據庫 : create database 數據庫庫名;

                                            顯示全部的數據庫 : show databases;

                                            刪除   : drop databases 數據庫名;

                       建立數據表  : 指定數據庫  :use 數據庫名;

                                            建立新表   :create table 表名(域名 數據類型 列選項[]);

                                            指定字符集 : 支持中文在建立新表命令後添加語句:charset=utf8;

    三、數據插入及顯示   插入 : insert into 表名(列名1,列明2,……) values(數據1 數據2);

                                   顯示 : select 列名1,列名2,……from表名

    四、顯示錶信息         顯示全部表

                                   顯示錶結構 :desc/describe 表名;

                                   刪除表 : drop table 表名;

    五、數據插入及顯示   插入 : insert into 表名(列名1,列名2……) values (數據1,數據2……)

    六、自增序列的設置    :數據類型必須爲int,列的定義後附加關鍵字 auto_incre,ment使用primary key設置其惟一性:alter table 表名 auto_increment =0

    七、更新    update 表名 set 列名1=值1,列名2=值2,……where條件表達式;

    八、刪除    delete from 表名 where 條件表達式;

                    truncate table 表名;                       #刪除全部的數據

     九、查詢 select列表1,列名2,…… from 表名[條件表達式];          條件檢索 : where birth>='1980-10-10';

                                                                                                    模糊檢索:where nam like '李%'

                                                                                                    NULL條件 :where birth is NULL;

                                                                                                    多條件結合:where sex='1' and birth is not NULL;

                                                                                                    結果排序:order by sex asc(升),birth desc(降);

                                                                                                    指定區間 :order by birth desc limit 2;排序後取前幾           top 2    排名靠前兩位的     

案例: 

把姓名爲「張三」,改爲「李四」(誤更改數據):

mysql > update t1 set name='李四' where id = 1;

查詢一小時內的歷史數據。

SELECT * FROM t FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 HOUR) AND NOW();

查詢一段時間內的歷史數據。

SELECT * FROM t1 FOR SYSTEM_TIME FROM '2018-05-15 00:00:00' TO '2018-05-15 14:00:00';

查詢全部歷史數據。

SELECT * FROM t1 FOR SYSTEM_TIME ALL;

   恢復歷史數據

                       找到了歷史數據「張三」,只需把它導出來作恢復便可。

SELECT id,name FROM t1 FOR SYSTEM_TIME ALL where id = 1 AND name = 

'張三' into outfile '/tmp/t1.sql' \

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

FIELDS TERMINATED BY ',' —— 字段的分隔符

OPTIONALLY ENCLOSED BY '"' —— 字符串帶雙引號 

導入恢復。

load data infile '/tmp/t1.sql' replace into table t1 \

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' \

(id,name);

 

   十、修改表的列結構   改變列的數據類型 :alter talble 表名 modify 列名 數據類型;

                                      追加新列:alter table 表名 add 列名 數據類型;

                                      改變列的位置:alter table 表名 modify 列名1 數據類型after 列名2;

                                      改變列名與類型: alter table 表名 change 列名——改前 to 列名_改後;

                                      刪除列:alter table 表名 drop lie名;                         

   十一、複製表和修改表  表的列構造+數據複製  : create table 新表名 select * from 舊錶名; 

                                     列構造 : create table 新表名 like 舊錶名;            

                                     數據複製 :insert into 表名 select * from 含數據的表;

   十二、顯示/查看數據庫具體信息   

                                     用來顯示受權用戶的安全權限:SHOW GRANTS;

                                     用來顯示數據庫服務器或警告信息:SHOW ERRORS 或者SHOW WARNINGS;                                    

                                     用於顯示建立數據庫時的建立語句:SHOW CREATE DATABASE customers;

                                     獲取當前所選的數據庫中全部可用的表:SHOW TABLES;

                                     獲取表中全部列的信息:SHOW COLUMNS FROM tableName;同時DESCRIBE語句有相同的效果:DESCRIBE tableName;                       

獲取服務器元數據

命令 描述
SELECT VERSION( ) 服務器版本信息
SELECT DATABASE( ) 當前數據庫名 (或者返回空)
SELECT USER( ) 當前用戶名
SHOW STATUS 服務器狀態
SHOW VARIABLES 服務器配置變量

MySQL 的數字列類型
     類型名                                涵義
   TINYINT                              一個很小的整數
   SMALLINT                           一個小整數
   MEDIUMINT                       一箇中等大小整數
   INT、INTEGER                    一個正常大小整數
   BIGINT                                一個大整數
   FLOAT                                 一個小(單精密)浮點數字
   DOUBLE                              一個正常大小(雙精密)浮點數字
   DOUBLE PRECISION
   REAL
   DECIMAL                             一個未壓縮(unpack)的浮點數字, 「未
   NUMERIC                             壓縮」意味着數字做爲一個字符串被存儲


   CHAR                                   一個定長字符串
   VARCHAR                            一個變長字符串
   TINYBLOB                            最大長度爲 255(2^8-1)個字符的
   TINYTEXT                            BLOB 或TEXT 列
   BLOB                                   最大長度爲 65535(2^16-1)個字符的  
   TEXT                                    BLOB 或TEXT 列


MEDIUMBLOB                             最大長度爲16777215(2^24-1)個字符
MEDIUMTEXT                              的 BLOB 或TEXT 列;


LONGBLOB                                   最大長度爲4294967295(2^32-1)個字
LONGTEXT                                    符的 BLOB 或TEXT 列;


ENUM('value1','value2',...               枚舉:列只能賦值爲某個枚舉成員或
NULL
)

SET('value1','value2',...)                  集合:列能夠賦值爲多個集合成員或
NULL

MySQL的數字列類型有兩種:

  • 整型 MySQL 提供了五種整型 tinyint、samllint、mediumint、int 和bigin。整數列能夠用 unsigned 禁用負數值。
  • 浮點型 MySQL提供了三種浮點型,float、double和 decimal。

MySQL提供的字符串類型包括 CHAR、VARCHAR、BLOB、TEXT、ENUM和 SET

mysql數據庫使用總結

本文主要記錄一些mysql平常使用的命令,供之後查詢。

1.更改root密碼

mysqladmin -uroot password 'yourpassword'

修改密碼:mysqladmin -u USER -p password PASSWORD(修改密碼會提示輸入原密碼)

刷新:flush privileges

 1,給用戶配置初始密碼123456:
         mysqladmin -u root -password 123456


  2,修改root用戶密碼爲 abc123
          mysqladmin -u root -p123456 password abc123

 3,若是想去掉密碼:
          mysqladmin -u root -pabc123 password

  4,root鏈接數據庫有密碼和無密碼:
         mysql -u root(-uroot) -p
         mysql

  5.root查看用戶密碼及權限

         select user,host,password from mysql.user;

         select * from mysql.db;

mysql帳號權限添加:

mysql -uroot -p
mysql>insert into mysql.user(Host,User,Password) values('%', 'userrw', password('userrw')); 
mysql>flush privileges;                             #刷新權限

建立一個能夠從任何地方鏈接到服務器的一個超管帳戶,必須分配一個密碼
mysql>grant all  on *.* to 'user_name'@'%' identified by 'password';   #賦予所有權限

格式:grant select on 數據庫.* to 用戶名@登陸主機 identified by 「密碼」

 

建立主從帳號:
grant replication slave on *.* to 'repl'@'192.168.56.%' identified by 'repl';
flush privileges;

刪除受權:
mysql> revoke all privileges on *.* from root@」%」;
mysql> delete from user where user=」root」 and host=」%」;
mysql> flush privileges;

重命名錶:
mysql > alter table t1 rename t2;

備份:
mysqldump -hhostname -uusername -ppassword databasename > backup.sql;

恢復:
mysql -hhostname -uusername -ppassword databasename< backup.sql;


mysql>grant select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file on *.* to 'userrw'@'%' identified by 'userrw';
mysql>flush privileges;

 #mysql 5.7以上版本添加mysql.user帳號方法(password字段改成了authentication_string):
        CREATE USER 'user'@'localhost' IDENTIFIED BY 'userrw';
        CREATE USER 'userro'@'localhost' IDENTIFIED BY 'userro';
        grant all privileges on db.* to 'userrw'@'localhost';
        grant all privileges on db.* to 'userro'@'localhost';

改數據庫、表和列的字符集

更改數據庫、表和列的字符集和排序規則屬性以使用utf8mb4而不是utf8.

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)

 

MySQL配置文件(/etc/my.cnf)修改字符集爲utf8mb4:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
mysql>SET NAMES utf8mb4; # just to emphasize that the connection charset is set to `utf8mb4`

查看設置的字符集是否成功。

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

修復和優化全部表

對要修復和優化的每一個表運行如下MySQL查詢:

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;

幸運的是,這能夠很容易地使用命令行一次完成。mysqlcheck效用:

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases

這將提示根用戶的密碼,在此以後,全部數據庫中的全部表都將被修復和優化。

MySQL 修改最大鏈接數

修改方式有兩種

1.命令行修改

進入mysql後,set GLOBAL max_connections=1024; 便可當即生效,可是博主沒有使用這種方式,由於這種方法治標不治本,一點重啓mysql,最大鏈接數又會變回151

2.修改配置,而後重啓

vi /etc/m.cnf加入max_connections=1024,而後重啓mysql便可。

重啓後,很遺憾,max_connections變成了214,這就很詭異了。我把max_connections又分別設置成500和213,實際的max_connections分別是214和213。也就是說,在這臺服務器上,max_connections最大隻能是234,猜想是由於操做系統的限制致使max_connections最大隻能爲213。max_connections依託於操做系統,Linux系統必要時須要增長open-files-limit。修改max_connections居然要修改操做系統最大文件描述符。

vi /usr/lib/systemd/system/mysqld.service加入

LimitNOFILE=50000

重啓MySQL

=

將 MySQL 8.0 中已有的 SHA2 密碼修改成 SHA1 的模式。

# 更新用戶的密碼加密方式爲以前版本的方式
mysql> ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';
# 刷新權限
mysql> FLUSH PRIVILEGES;

注:若是沒有特殊的緣由,建議使用更安全的新加密方式。

  • 在 MySQL 8.0 用以前版本受權語句建立用戶。

mysql> GRANT ALL PRIVILEGES ON *.* TO `mike`@`%` IDENTIFIED BY '000000' WITH GRANT OPTION;
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 '000000' WITH GRANT OPTION' at line 1
  • 在 MySQL 8.0 版本中正確受權語句。

mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000';
mysql> GRANT ALL ON *.* TO 'mike'@'%' WITH GRANT OPTION;

密碼過時時間管理

並在 MySQL 5.7.4 版本中改進了用戶密碼過時時間這個特性。如今能夠經過一個全局變量 default_password_lifetime 來設置一個全局的自動密碼過時策略。

default_password_lifetime 其默認值爲 0,表示禁用自動密碼過時。default_password_lifetime 的值如是是正整數 N ,則表示容許的設置密碼生存週期 爲 N,單位爲天 。

  • default_password_lifetime 全局密碼到期策略默認爲永久,不過時。

mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 0     |
+---------------------------+-------+
1 row in set (0.00 sec)
  • 若是你要創建一個全局策略,讓全部用戶的密碼的使用期限爲六個月,可在服務端配置文件 my.cnf 中修改 default_password_lifetime 配置項的值爲 180。

[mysqld]
default_password_lifetime=180
  • 若是你要恢復全局策略,讓全部用戶的密碼永不過時,可在服務端配置文件 my.cnf 中修改 default_password_lifetime 配置項的值爲 0。

[mysqld]
default_password_lifetime=0
  • default_password_lifetime 參數是支持永久動態設置的,你也能夠用如下命令在 MySQL 命令行下直接設置生效。

# 設置默認密碼過時策略爲 180 天后過時
mysql> SET PERSIST default_password_lifetime = 180;

# 設置默認密碼過時策略爲永不過時
mysql> SET PERSIST default_password_lifetime = 0;

# MySQL 8.0 永久動態修改參數會保存在配置文件 mysqld-auto.cnf 中,保存的格式爲JSON串。
$ cat  /var/lib/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "default_password_lifetime" : { "Value" : "180" , "Metadata" : { "Timestamp" : 1525663928688419 , "User" : "root" , "Host" : "" } } } }
  • 建立和修改帶有密碼過時時間的用戶示例
     

建立或修改一個用戶的密碼過時時間爲 90 天。

mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000' PASSWORD EXPIRE INTERVAL 90 DAY;
mysql> ALTER USER `mike`@`%` PASSWORD EXPIRE INTERVAL 90 DAY;

建立或修改一個用戶的密碼過時時間爲永不過時。

mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE NEVER;
mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE NEVER;

建立或修改一個遵循全局到期策略的用戶。

mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;
mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;

查看用戶的密碼過時時間。

mysql> select user,host,password_last_changed,password_lifetime,password_expired from mysql.user;
+------------------+-----------+-----------------------+-------------------+------------------+
| user             | host      | password_last_changed | password_lifetime | password_expired |
+------------------+-----------+-----------------------+-------------------+------------------+
| mike             | %         | 2018-05-07 11:13:39   |                90 | N                |
| root             | %         | 2018-05-04 16:46:05   |              NULL | N                |
| mysql.infoschema | localhost | 2018-05-04 16:45:55   |              NULL | N                |
| mysql.session    | localhost | 2018-05-04 16:45:55   |              NULL | N                |
| mysql.sys        | localhost | 2018-05-04 16:45:55   |              NULL | N                |
| root             | localhost | 2018-05-04 16:46:05   |              NULL | N                |
+------------------+-----------+-----------------------+-------------------+------------------+
6 rows in set (0.00 sec)

用戶管理

建立用戶

create user '用戶名'@'IP地址' identified by '密碼';

刪除用戶

drop user '用戶名'@'IP地址';

修改用戶

rename user '用戶名'@'IP地址'; to '新用戶名'@'IP地址';

修改密碼

set password for '用戶名'@'IP地址' = Password('新密碼');

注:用戶權限相關數據保存在mysql數據庫的user表中,因此也能夠直接對其進行操做(不建議)

建立用戶

create user '用戶名'@'IP地址' identified by '密碼';

刪除用戶

drop user '用戶名'@'IP地址';

修改用戶

rename user '用戶名'@'IP地址'; to '新用戶名'@'IP地址';

修改密碼

set password for '用戶名'@'IP地址' = Password('新密碼');

注:用戶權限相關數據保存在mysql數據庫的user表中,因此也能夠直接對其進行操做(不建議)

權限管理

mysql對於權限這塊有如下限制:

all privileges:除grant外的全部權限
select:僅查權限
select,insert:查和插入權限
...
usage:無訪問權限
alter:使用alter table
alter routine:使用alter procedure和drop procedure
create:使用create table
create routine:使用create procedure
create temporary tables:使用create temporary tables
create user:使用create user、drop user、rename user和revoke  all privileges
create view:使用create view
delete:使用delete
drop:使用drop table
execute:使用call和存儲過程
file:使用select into outfile 和 load data infile
grant option:使用grant 和 revoke
index:使用index
insert:使用insert
lock tables:使用lock table
process:使用show full processlist
select:使用select
show databases:使用show databases
show view:使用show view
update:使用update
reload:使用flush
shutdown:使用mysqladmin shutdown(關閉MySQL)
super:使用change master、kill、logs、purge、master和set global。還容許mysqladmin調試登錄
replication client:服務器位置的訪問
replication slave:由複製從屬使用

查看權限:

show grants for '用戶'@'IP地址'

二、受權

grant  權限 on 數據庫.表 to   '用戶'@'IP地址'

三、取消受權

revoke 權限 on 數據庫.表 from '用戶名'@'IP地址'

受權實例以下:

grant all privileges on db1.tb1 TO '用戶名'@'IP'

grant select on db1.* TO '用戶名'@'IP'

grant select,insert on *.* TO '用戶名'@'IP'

revoke select on db1.tb1 from '用戶名'@'IP'

 

2.遠程登錄mysql服務器

mysql -uroot -p -h192.168.137.10 -P3306

3.查詢數據庫/顯示數據庫列表

show databases;

缺省有兩個數據庫:mysql和test。 mysql庫存放着mysql的系統和用戶權限信息,咱們改密碼和新增用戶,實際上就是對這個庫進行操做。

 

4.進入某個數據庫

use databasename;                                #切換數據庫

show tables;                                           #查看數據庫所有表

select * from 表名;                                   # 查看錶全部內容

select * from test01 limit 10;               #查看前十行。

select Host,User,Password from user;             #查看Host,User,Password 三個字段

 

 

select * from test01 where name="xiao_111";                #在test01中查看xiao

select * from test01 where name="xiao_111" and age=21;   

select * from test01 where like name="%xiao_111%" and age=21;   

搜索延遲,沒有添加索引,重複執行一次命令。

建立數據庫:    

create database db1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # utf8編碼

create database db1 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; # gbk編碼

查看某一個數據表,如表user

show createtable mysql.user;

或者show create table user;

或show create table mysql.user\G; (表的詳細結構)

select curtime();                                     #返回當前的系統時間;

select now();                                          #返回當前的系統日期和時間;

show status like '%lock%';                     # 查詢鎖狀態;

show engine innodb status\Gshow master status\G             # 查看show engine innodb status\G 查看最近死鎖信息;show slave master 用於提供有關從屬服務器線程的關鍵參數的信息

show variables like '%max_connection%';                                #查看數據庫鏈接數

set global max_connctions=500;                             #設置鏈接數爲500;

set global innodb_stats_on_metadata=0                #設置併發處理數量爲0

show processlist顯示的狀態裏面,update表示正在insert ,updating表示正在delete,Updating纔是表示正在update

查看錶MySQL數據庫的遠程訪問user的用戶及密碼

select host,user,password from mysql.user;

kill SESSION_ID;                              # 殺掉有問題的session;

select * from 表名                           #查詢表中的內容

show engines \G                             #查詢該數據庫支持的存儲引擎類型 ss ;   \g 、\G與」;「效果同樣,

show variables like 'have%';                         #查詢MySQL支持的存儲引擎;     

show variables like 'storage_engine';                #查詢默認存儲引擎;   修改默認的引擎在my.ini配置文件中修改,將"mysqld部分存在efault-storage-engine=INNODB"更改成"default-engine=MyISAM"。而後重啓服務修改生效。

show create table user \G;                             #查看user表的存儲引擎以及表的內容

alter table test rename text                             #將test表改爲text表。

將在表user中增長一個沒有完整性約束的phone字段

alter table user modify name varchar(30);                            #修改字段數據類型爲varchar(30);

增長無完整性約束條件的字段

alter table user add phone varchar(20);                               #在user表中增長一個沒有完整性約束條件約束的phone字段

修改字段的排列位置

將user表中的name字段 修改成該表的第一個字段。

alter table user modify name varchar(30) first;

刪除字段

從user表中刪除id字段

alter table user drop id;

表的第一個位置增長字段

在user表中第一個位置增長num字段,並設置num字段爲主鍵

alter table user add num int(8) primary key first;

表指定位置以後增長位置

在user表的phone字段後增長address字段,並設置address字段爲非空。

alter table user add address varchar(30) not null after phone;

更改表的存儲引擎

將user表的存儲引擎改成MyISAM.

alter table user ENGINE=MyISAM

show create table user \G;            #查看修改的結果

show index from t;                       使用show語句查看t表上的索引:

show create table t\G                     使用show create table語句查看索引:

 

增長有完整性約束條件的字段

將在user表中增長一個有非空約束的age字段,其數據類型爲INT(4).

alter table user add age int(4) not null;

表的第一個位置增長字段

將在user表中第一個位置增長num字段,並設置num字段爲主鍵。增長num字段,並設置num字段爲主鍵。

alter table user add num int(8) primary key first;

刪除字段

將user表中刪除id字段

alter table user drop id;

 

常見報錯

Multiple primary key defined

多主鍵定義

Duplicate column name 'num'

重複列名「num」

 

查看當前所在數據庫

select database();

注意:若是一個用戶沒有一個表的任何權限,表將不在 SHOW TABLES 或 mysqlshowdb_name 中的輸出中顯示。

 

5.刪除表中數據
命令:delete from 表名 where 表達式
例如:刪除表 MyClass 中編號爲 1 的記錄
mysql> delete from MyClass where id=1;

修改表中數據
命令:update 表名 set 字段=新值,… where 條件

mysql> update MyClass set name='Mary' where id=1;

在表中增長字段
命令:alter table 表名 add 字段 類型 其餘;
例如:在表 MyClass 中添加了一個字段 passtest,類型爲 int(4),默認值爲 0

mysql> alter table MyClass add passtest int(4) default '0'

更改表名

命令:rename table 原表名 to 新表名;
例如:在表 MyClass 名字更改成 YouClass

mysql> rename table MyClass to YouClass;

更新字段內容
命令:update 表名 set 字段名 = 新內容

update 表名 set 字段名 = replace(字段名, '舊內容', '新內容');

例如:文章前面加入 4 個空格

update article set content=concat('    ', content);

刪除pad列上的histogram:

mysql > analyze table test drop histogram on pad;

ANALYZE TABLE sbtest1 DROP HISTOGRAM ON pad;

直方圖統計信息存儲於InnoDB數據詞典中,能夠經過information_schema表來獲取。

mysql>show create table information_schema.column_statistics\G

root@information_schema 05:34:49>SHOW CREATE TABLE INFORMATION_SCHEMA.COLUMN_STATISTICS\G
*************************** 1. row ***************************
                View: COLUMN_STATISTICS
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql.infoschema`@`localhost` SQL SECURITY DEFINER VIEW `COLUMN_STATISTICS` AS select `mysql`.`column_statistics`.`schema_name` AS `SCHEMA_NAME`,`mysql`.`column_statistics`.`table_name` AS `TABLE_NAME`,`mysql`.`column_statistics`.`column_name` AS `COLUMN_NAME`,`mysql`.`column_statistics`.`histogram` AS `HISTOGRAM` from `mysql`.`column_statistics` where can_access_table(`mysql`.`column_statistics`.`schema_name`,`mysql`.`column_statistics`.`table_name`)
character_set_client: utf8
collation_connection: utf8_general_ci1 row in set (0.00 sec)

 

從column_statistics表的定義能夠看到,有一個名爲mysql.column_statistics系統表,但被隱藏了,沒有對外暴露。

查詢表上的直方圖信息

>SELECT JSON_PRETTY(HISTOGRAM) FROM INFORMATION_SCHEMA.COLUMN_STATISTICS WHERE SCHEMA_NAME='sb1' AND TABLE_NAME = 'sbtest1'\G

將全局和session級別long_query_time設置爲1.

> set global long_query_time=1;

> set session long_query_time=1;

 

用 ALTER TABLE 語句修改表的結構

 

  • 增長列
  • alter table tbl_name add col_name type
  • 例如,給表增長一列weight
  • mysql>alter table pet add weight int;
  • 刪除列
  • alter table tbl_name drop col_name
  • 例如,刪除列weight:
  • mysql>alter table pet drop weight;
  • 改變列
  • alter table tbl_name modify col_name type

例如,改變weight 的類型:

  • mysql> alter table pet modify weight samllint;
  • 另外一種方法是:
  • alter table tbl_name change old_col_name col_name type
  • 例如:
  • mysql> alter table pet change weight weight samllint;
  • 給列改名
  • mysql>alter table pet change weight wei;
  • 給表改名
  • alter table tbl_name rename new_tbl
  • 例如,把 pet 表改名爲 animal
  • mysql>alter table pet rename animal;

 

6.查看某個表所有字段

desc slow_log;

show create table slow_log\G;              #查看錶的類型(不只能夠顯示錶信息,還能夠顯示建表語句)

7.查看當前用戶

select user();           #查詢當前用戶

select User from mysql.user;root          #用戶登陸,查看全部用戶


8.增長用戶

mysql -uroot -pmysql;               #鏈接到本機上的 MySQL。
mysql -h 127.0.0.1 -uroot -pmysql;           #鏈接到遠程主機上的 MYSQL。

修改新密碼

在終端輸入:

mysql -u用戶名 -p密碼,回車進入Mysql。
> use mysql;
> update user set password=PASSWORD('新密碼') where user='用戶名';
> flush privileges; #更新權限
> quit; #退出

增長新用戶

格式:

grant select on 數據庫.* to 用戶名@登陸主機 identified by '密碼'

例子 :

例 1 : 增長一個用戶 test1 密碼爲 abc,讓他能夠在任何主機上登陸,並對全部數據庫有
查詢、插入、修改、刪除的權限。首先用以 root 用戶連入 MySQL,而後鍵入如下命令:

mysql>grant select,insert,update,delete on *.* to root@localhost identified by 'mysql';

或者

grant all privileges on *.* to root@localhost identified by 'mysql';

而後刷新權限設置。

flush privileges;

例 2:若是你不想 root 有密碼操做數據庫「mydb」裏的數據表,能夠再打一個命令將密碼消掉。

grant select,insert,update,delete on mydb.* to root@localhost identified by '';

刪除用戶

hadoop@ubuntu:~$ mysql -u用戶名 -p密碼
mysql>delete from user where user='用戶名' and host='localhost';
mysql>flush privileges;
//刪除用戶的數據庫
mysql>drop database dbname;

 

9.建立新數據庫(能夠指定字符集)

create database db1 charset utf8;

建立GBK字符集數據庫mingongge並查看完整建立語句 : create database mingongge default charset gbk collate gbk_chinese_ci;

建立用戶mingongge使用之能夠管理數據庫mingongge : grant all on mingongge.* to 'mingongge'@'localhost' identified by 'mingongge';

查看建立用戶mingongge的權限 : show grants for mingongge@localhost;

建立數據庫:create database db01; 

查看當前數據庫有哪此用戶 : select user from mysql.user;

使用/進入數據庫: use db01;

建立用戶:create user guest@localhost identified by '123456';

受權:grant select on mysql.* to guest@localhost identified by '123456';

           grant select,insert,update,delete on *.* to user1@localhost Identified by "password1"; --此命令也能夠做爲修改密碼的命令

 建立用戶並all權限給在test_gbk庫全部表,密碼‘123456’     #grant all on test_gbk.* to 'testuser'@'localhost' identified by '123456';

刷新權限,使權限生效 :  flush privileges;

查看用戶有哪些權限 : show grants for 'testuser'@'localhost';

收回權限 : revoke insert,update,select,delete on test_gbk.* from 'testuser'@'localhost';

 

10.建立新表

mysql >use student;

mysql > create table t1 (`id` int(4), `name` char(40));

mysql> show create table t1\G;                            #

##經過現有的表建立新表

mysql> create table T2 as select * from T1;

查看建表結構及表結構的SQL語句

desc test;

show create table test\G

插入一條數據「1,mingongge」

insert into test values('1','mingongge');

再批量插入2行數據「2,民工哥」,「3,mingonggeedu」

insert into test values('2','民工哥'),('3','mingonggeedu');

刪除students表中的 id 爲 3 的行: delete from students where id=3;

刪除全部年齡小於 21 歲的數據: delete from students where age<20;

刪除表中的全部數據: delete from students;

查詢名字爲mingongge的記錄

select * from test where name = 'mingongge';

把數據id等於1的名字mingongge更改成mgg

update test set name = 'mgg' where id = '1';

把數據id等於2的age年齡更改成22(歲)

update test set age = '22' where id = '2';

 

update 語句可用來修改表中的數據, 簡單來講基本的使用形式爲:

update 表名稱 set 列名稱=新值 where 更新條件;

如下是在表 students 中的實例 :

將 id 爲 5 的手機號改成默認的 - : update students settel=default where id=5;

將全部人的年齡增長 1: update students set age=age+1;

將手機號爲 13288097888 的姓名改成 "小明", 年齡改成 19: update students setname="小明", age=19 wheretel="13288097888";

 

在字段name前插入age字段,類型tinyint(2)

alter table test add age tinyint(2) after id;

不退出數據庫,完成備份mingongge數據庫

#system mysqldump -uroot -ppassword -B mingongge >/root/mingongge_bak.sql

實例 : 

在數據庫裏,建立一個新的表

建立數據庫   :   create database students;

使用數據庫   :   use students;

建立student111表格 :   create table student111(id int, name varchar(20),age int,phone char(11),height float(3,2)); 

查看student111 表的表結構    :    desc student111;

下面的test表中建立了3個重複索引,在ID列上建了主鍵、惟一索引、普通索引。

create table test(
id int not null PRIMARY KEY,
A int not null,
B int not null,
UNIQUE(ID),
INDEX(ID)
)engine=innodb;

在student111表裏面插入5條數據

insert student111 values(1,'li',21,'11011011011',1.72);

insert student111 values(2,'li',23,'11011011012',1.98);

insert student111 values(3,'li',42,'11011011013',1.60);

insert student111 values(4,'li',25,'11011011014',1.78);

insert student111 values(5,'li',28,'11011011015',1.89);

將student111表名修改成student_details

rename table student111 to student_details;

將student_details中的height字段刪除

alter table student_details drop height;

在student_details裏添加一個新字段,字段名爲gender,並增長兩條數據。

alter table student_details add gender char(5);

update student_details set gender='woman' where id = 1;

update student_details set gender='woman' where id = 2;

刪除 student_details表

drop  student_details;

 

建立數據庫表(create table 表名(內容))

create table teacher01(id int,name varchar(20),salary float(4,2));
插入數據  :(insert into 表名 value(內容))

 

group by 分組

GROUP BY子句的真正做用在於與各類聚合函數配合使用。它用來對查詢出來的數據進行分組。

create table t_order(id int primary key,product varchar(20),price float(8,2));
insert into t_order values(1,'xiaomi', 1000);
insert into t_order values(2,'xiaomi',1100);
insert into t_order values(3,'huawei',2200);
insert into t_order values(4,'apple',8200);
1.對訂單表中商品歸類後,顯示每一類商品的總價
select product,sum(price) from t_order GROUP BY product;

查詢每一類商品總價格大於3000的商品
select product,sum(price) as total from t_order GROUP BY product HAVING total>3000;

WHERE是在分組(group by)前進行條件過濾,

HAVING子句是在分組(group by)後進行條件過濾,

WHERE子句中不能使用聚合函數,HAVING子句能夠使用聚合函數。

 

11.刪除表t和mingongge數據庫並查看

drop table test;

show tables;

drop database mingongge;

show databases;

 

12.清空表數據

truncate table db1.t1;

刪除test表中的全部數據,並查看

delete from test;

select * from test;

 

13.更改表的某一行數據

update db1.t1 set name='aaa' where id=1;

14.查詢表數據

select * from mysql.db;           //查詢該表中的全部字段

select count(*) from mysql.user;  //count(*)表示表中有多少行

select db,user  from mysql.db;    //查詢表中的多個字段

select * from mysql.db where host like '10.0.%';                #在查詢語句中能夠使用萬能匹配 「%」

 

15.清空數據庫中的全部表(數據庫名是eab12)

mysql -N -s information_schema -e "SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM TABLES WHERE TABLE_SCHEMA='eab12'" | mysql -f eab12

 

16.查看數據庫版本

select version();

select batabase();                  #查看當前鏈接的數據庫,至關於pwd

 select user();                      #查看當前鏈接數據庫的用戶,至關於whoami

查看MySQL字符集

mysql> show variables like '%character%';

character_set_server                默認的內部操做字符集

character_set_client               客戶端來源數據使用的字符集

character_set_connection       鏈接層字符集

character_set_results               查詢結果字符集

character_set_database           當前選中數據庫的默認字符集

character_set_system               系統元數據(字段名等)字符集

查看數據庫編碼

SHOW CREATE DATABASE db_name;

mysql> show create database wl;

查看錶字符集編碼

SHOW CREATE TABLE tbl_name;

查看字段字符集編碼

mysql>show full columns from tbl_name

 

設置字符集編碼(設置character_set_client、character_set_connection、character_set_results);

SET NAMES xxx;      例如 : set names gbk;             

mysql> show variables like '%char%';              #查看現有字符集編碼,設置好了,使用這個命令查看效果;

修改數據庫字符集(只能改變後續建立表,沒法改變已建立表)

ALTER DATABASE DATABASENAME CHARACTER SET XXX;

修改表的字符集

ALTER TABLE TABLENAME CHARACTER SET XXX;(只能改變後續添加數據) 
ALTER TABLE TABLENAME CONVERT TO CHARACTER SET XXX;(所有從新寫入)

修改列字符集

ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE …];

mysql>SHOW FULL COLUMNS FROM emp;

mysql>ALTER TABLE emp CHANGE ename ename VARCHAR(10) CHARACTER SET utf8;

mysql>SHOW FULL COLUMNS FROM emp;

 

 

17.查看數據庫狀態

show status;                    當前會話狀態

show global status;          全局數據庫狀態

show slave status\G;        查看主從數據庫狀態信息

show tables;                     顯示當前庫全部表

Show Databases;              顯示全部數據庫

 

18.查詢數據庫參數

show variables;

19.修改數據庫參數

show variables like 'max_connect%';

set global max_connect_errors = 1000;(重啓數據庫會失效,要在配置文件中修改)

 

20.查看當前數據庫隊列

show processlist;

21.建立普通用戶並受權給某個數據庫

grant all on databasename.* to 'user1'@'localhost' identified by '123456';

 

22.插入一行數據

insert into db1.t1 values (1, 'abc');19.

23.刪除數據庫

drop database db1;

 

24.數據庫備份

mysqldump  -uroot -p'yourpassword' mysql >/tmp/mysql.sql

25.數據庫恢復

mysql -uroot -p'yourpassword' mysql </tmp/mysql.sql

 

26.新建普通用戶

CREATE USER name IDENTIFIED BY 'ssapdrow';

27.更改普通用戶密碼

SET PASSWORD FOR name=PASSWORD('fdddfd');

 

28.查看name用戶權限

SHOW GRANTS FOR name;

29.腳本中執行mysql命令

mysql -uuser -ppasswd -e"show databases"

echo "show databases"|mysql -uuser -ppassword

如下是執行大量mysql語句採用的方式

mysql -uuser -hhostname -ppasswd <<EOF

mysql語句

EOF

 

mysql> -- 下面咱們另外添加一個新的 root 用戶, 密碼爲空, 只容許 192.168.1.100 鏈接

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密碼' WITH GRANT OPTION;

mysql> -- @'192.168.1.100'能夠替換爲@‘%’就可任意ip訪問,固然咱們也能夠直接用 UPDATE 更新 root 用戶 Host, 但不推薦, SQL以下:

mysql> -- UPDATE user SET Host='192.168.1.100' WHERE User='root' AND Host='localhost' LIMIT 1;

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

30、授全部權:

grant all privileges on icsdb1.* to iccard@'%' Identified by 'iccard' WITH GRANT OPTION;(其餘ip訪問)
grant all privileges on icsdb1.* to iccard@'localhost' Identified by 'iccard' WITH GRANT OPTION;(本機訪問)

 

3一、顯示庫中的數據表:
use mysql;
show tables;

 

3二、顯示數據表的結構:

show tables;      #列出數據庫中全部的表
describe 表名;        #獲取表結構

desc 表名;              #獲取表結構 

show columns from  表名;                   #獲取表結構 

 

3三、建庫與刪庫:
create database 庫名;
drop database 庫名;

 

3四、建表:
use 庫名;
create table 表名(字段列表);
drop table 表名;

3五、清空表中記錄:
delete from 表名;

 

3六、顯示錶中的記錄:
select * from 表名;

3七、mysql導出數據庫

>mysqldump -h localhost -u dev01 -p ecmall>~/20091127_ecmall.sql
導出數據表

 

3八、MySQL最大鏈接數設置

MySQL的最大鏈接數默認是100

客戶端登陸:mysql -uusername -ppassword

設置新的最大鏈接數爲200:mysql> set GLOBAL max_connections=200

顯示當前運行的Query:mysql> show processlist

顯示當前狀態:mysql> show status

退出客戶端:mysql> exit

查看當前最大鏈接數:mysqladmin -uusername -ppassword variables |find "max_con"

 

3九、按字符集導出

$mysqldump -u root -p dbname --default-character-set=gbk > a.sql;

40、單獨設置某個數據庫字符集:
alter database testdb character set utf8;

 

4一、查看mysql支持的編碼
show character set;

4二、查看系統的字符集排序方式的設定能夠經過下面的兩條命令:

mysql> SHOW VARIABLES LIKE ''character_set_%'';

 

4三、導出數據

$ mysqldump -u root -p dbname --default-character-set=gbk > base_user.sql;

 

備份數據

單庫備份

4四、# mysqldump -uroot -p test >/download/testbak_$(date +%F).sql

# ll /download/             #查看生成的以日期爲名字的數據庫

# egrep -v "^--|\*|^$" /download/testbak_2016-12-12.sql        #查看備份文件內容

 

# mysqldump -uroot -p -B test >/download/testbak_$(date +%F)_b.sql

-B參數的做用一目瞭然,就是當咱們的數據庫丟失時,能夠直接用此備份文件進行恢復,無需再從新建庫、建表,而後再進行數據恢復的操做

壓縮備份

# mysqldump -uroot -p -B test|gzip >/download/testbak_$(date +%F).sql.gz

# ll /download/testbak_2016-12-12.sql.gz

多庫備份

# mysqldump -uroot -p -B test mysql|gzip >/download/testbak_$(date +%F).sql01.gz

#mysqldump -uroot -p -B --events test mysql|gzip >/download/testbak_$(date +%F).sql02.gz           #-B忽略備份過程的提示信息    ,  此備份方法不經常使用

# ll /download/testbak_2016-12-12.sql02.gz       

多庫備份時就須要進行屢次單庫備份的操做

# mysqldump -uroot -p -B test|gzip >/download/testbackup_$(date +%F).sql.gz     

# mysqldump -uroot -p -B --events mysql|gzip >/download/mysqlbak_$(date +%F).sql.gz  

# ll /download/

單表備份

分庫備份是爲了恢復數據庫時方便操做,可是一樣面臨問題,若是是某個庫中的某一個表有損壞,但又不有全庫進行恢復,因此實際生產中經常使用的是分庫、分表進行備份,這樣數據也備份了,恢復時也好操做。

# mysqldump -uroot -p -B test test >/download/test_testbak_$(date +%F).sql 

egrep -v "#|^$|\*" /download/test_testbak_2016-12-12.sql

 

4五、建立一個innodb GBK表test,字段id int(4)和name varchar(16)

create table test (

 id int(4),

  name varchar(16)

 )ENGINE=innodb DEFAULT CHARSET=gbk

4六、  用 Alter Table 語句建立與刪除索引
爲了給現有的表增長一個索引,可使用 ALTER TABLE 或 CREATE INDEX 語句
ALTER TABLE 最經常使用,由於可用它來建立普通索引、UNIQUE 索引或 PRIMARY KEY
索引,如:
ALTER TABLE tbl_name ADD INDEX index_name (column_list);
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);
ALTER TABLE tbl_name ADD PRIMARY KEY index_name (column_list);
其中 tbl_name 是要增長索引的表名,而 column_list 指出對哪些列進行索引。一個
(col1,col2,...)形式的列表創造一個多列索引。索引值有給定列的值串聯而成。若是索引由不止一列組成,各列名之間用逗號分隔。索引名 index_name 是可選的,所以能夠不寫它,MySQL 將根據第一個索引列賦給它一個名稱。ALTER TABLE 容許在單個語句中指定多個表的更改,所以能夠在同時建立多個索引。
一樣,也能夠用 ALTER TABLE語句產出列的索引:
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;            

增長索引以前和以後           

建這樣的索引,以加速表的檢
索速度:
mysql> ALTER TABLE student
-> ADD PRIMARY KEY(id),
-> ADD INDEX mark(english,Chinese,history);

注意 : 記住,使用 PRIMARY索引的列,必須是一個具備 NOT NULL屬性的列,若是你願意產看建立的索引的狀況,能夠使用SHOW INDEX 語句:mysql> SHOW INDEX FROM student;

再使用 ALTER TABLE 語句刪除索引,刪除索引須要知道索引的名字,你能夠經過
SHOW INDEX 語句獲得:
mysql> ALTER TABLE student DROP PRIMARY KEY,
-> DROP INDEX mark;
再產看錶中的索引,其語句和輸出爲:
mysql> SHOW INDEX FROM student;
Empty set (0.01 sec)

用 CREATE\DROP INDEX 建立索引

利用 ALTER TABLE 語句建立索引(MySQL一般在內部將 CREATE INDEX 映射到 ALTER TABLE)。該語句建立索引的語法以下:
CREATE UNIQUE INDEX index_name ON tbl_name (column_list)
CREATE INDEX index_name ON tbl_name (column_list)
tbl_name、index_name 和 column_list 具備與 ALTER TABLE 語句中相同的含義。這裏索引名不可選。很明顯,CREATE INDEX 可對錶增長普通索引或 UNIQUE 索引,不能用 CREATE INDEX 語句建立 PRIMARY KEY 索引。
可利用 DROP INDEX 語句來刪除索引。相似於 CREATE INDEX 語句,DROP INDEX一般在內部做爲一條 ALTER TABLE 語句處理,
刪除索引語句的語法以下:
DROP INDEX index_name ON tbl_name
因爲 CREATE INDEX 不能建立 PRIMARY索引,須要建立一個多列索引。

ysql> CREATE INDEX mark ON student(english,chinese,history);
一樣的檢查 student 表,可知:
mysql> SHOW INDEX FROM student;

使用下面的語句刪除索引:
mysql> DROP INDEX mark ON student;

在建立表時指定索引

在發佈 CREATE TABLE 語句時爲新表建立索引,

在定義表列的語句部分指定索引建立子句,以下所示:
CREATE TABLE tbl_name
(
INDEX index_name (column_list),
KEY index_name (column_list),
UNIQUE index_name (column_list),
PRIMARY KEY index_name (column_list),

)

增長 PRIMARY KEY 建立一個單列的 PRIMARY
KEY 索引
,以下所示:
CREATE TABLE tbl_name
(
i INT NOT NULL PRIMARY KEY
)
該語句等價於如下的語句:
CREATE TABLE tbl_name
(
i INT NOT NULL,
PRIMARY KEY (i)
);

對索引列指定了 NOT NULL。若是是 ISAM 表,這是必須的,
由於不能對可能包含 NULL 值的列進行索引。若是是 MyISAM 表,索引列能夠爲 NULL,只要該索引不是 PRIMARY KEY 索引便可。

在 CREATE TBALE語句中能夠某個串列的前綴進行索引(列值的最左邊 n 個字符)

若是對某個串列的前綴進行索引,應用 column_list 說明符表示該列的語法爲
col_name(n) 而不用col_name。例如,下面第一條語句建立了一個具備兩個 CHAR 列的表
和一個由這兩列組成的索引。第二條語句相似,但只對每一個列的前綴進行索引:

CREATE TABLE tbl_name
(
name CHAR(30),
address CHAR(60),
INDEX (name,address)
)
CREATE TABLE tbl_name
(
name CHAR(30),
address CHAR(60),
INDEX (name(10),address(20))
);

 

 

4七、增長與刪除列

mysql> alter table T1 add age int(4) not null;

mysql> alter table T1 drop age

 

4八、更新表裏的數據

mysql> update T1 set age=25 where name='zhang';

mysql> update T1 set age=23 where name='li';

 

4九、刪除數據

mysql> delete from T1 where age='22';

建索引與刪除

mysql> create index indexT1 on T1(name(10));

mysql> drop index indexT1 on T1;

 

50、建立主鍵

mysql> alter table T1 add primary key(name);

mysql> desc T1;

 

5一、建立與刪除視圖

mysql> create view t1view as select name from T1;

mysql> select * from t1view;

刪除視圖

mysql> drop view t1view;

mysql> select * from t1view;

ERROR 1146 (42S02): Table 'student.t1view' doesn't exist

###提示此視圖不存在

查看視圖

show table status like '視圖名'  \G;               #查看視圖基本信息

showcreate view 視圖名 \G;                        #查看視圖詳細信息

select * from information_schema.views \G;               #查詢 information_schema數據庫下的views表;

CREATE OR REPLACE VIW                      #語句修改視圖

顯示department_view1有3個屬性,分別是department、function、localtion屬性。

truncate 刪除數據,致使自動清空自增ID,前端返回報錯 not found。

這個問題的出現,就要考慮下 truncate 和 delete 的區別了。

看下實驗演練:

首先先建立一張表

CREATE TABLE `t` (
  `a` int(11) NOT NULL AUTO_INCREMENT,
  `b` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`a`),
  KEY `b` (`b`)
) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8

先用 delete 進行刪除全表信息,再插入新值。

結果發現 truncate 把自增初始值重置了,自增屬性從1開始記錄了。當前端用主鍵id進行查詢時,就會報沒有這條數據的錯誤。

我的建議不要使用 truncate 對錶進行刪除操做,雖然能夠回收表空間,可是會涉及自增屬性問題。這些坑,咱們不要輕易鑽進去。

 

5二、查找表裏面的數據

表名:person_tbl )

查找name字段中以'st'爲開頭的全部數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'爲結尾的全部數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的全部數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符開頭或以'ok'字符串結尾的全部數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

 

5三、事務測試

MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務!

MYSQL 事務處理主要有兩種方法:

一、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務

  • ROLLBACK 事務回滾

  • COMMIT 事務確認

二、直接用 SET 來改變 MySQL 的自動提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交

  • SET AUTOCOMMIT=1 開啓自動提交

 

mysql> use RUNOOB;

Database changed

mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;               # 建立數據表

Query OK, 0 rows affected (0.04 sec)

mysql> select * from runoob_transaction_test;

Empty set (0.01 sec)

mysql> begin;             # 開始事務

Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test value(5);

Query OK, 1 rows affected (0.01 sec)

mysql> insert into runoob_transaction_test value(6);

Query OK, 1 rows affected (0.00 sec)

mysql> commit;             # 提交事務

Query OK, 0 rows affected (0.01 sec)

mysql> select * from runoob_transaction_test;

+------+

| id       |

+------+

| 5        |

| 6        |

+------+

2 rows in set (0.01 sec)

mysql> begin;          # 開始事務

Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test values(7);

Query OK, 1 rows affected (0.00 sec)

mysql> rollback; # 回滾

Query OK, 0 rows affected (0.00 sec)

mysql> select * from runoob_transaction_test;         # 由於回滾因此數據沒有插入

+------+

| id       |

+------+

| 5       |

| 6       |

+------+

2 rows in set (0.01 sec)

mysql>

 

5四、MySQL ALTER命令

當咱們須要修改數據表名或者修改數據表字段時,就須要使用到MySQL ALTER命令。

先建立一張表,表名爲:testalter_tbl。

mysql> use RUNOOB;

Database changed

mysql> create table testalter_tbl 

     -> (

     -> i INT,
     -> c CHAR(1)

    -> );

Query OK, 0 rows affected (0.05 sec)

mysql> SHOW COLUMNS FROM testalter_tbl;

+-------+---------+------+-----+---------+-------+

|  Field   |    Type  |  Null  |  Key  |  Default |  Extra  |

+-------+---------+------+-----+---------+-------+

| i           | int(11)  |  YES    |        | NULL     |             |

| c          | char(1)  | YES    |        | NULL     |              |

+-------+---------+------+-----+---------+-------+

2 rows in set (0.00 sec)

 

刪除,添加或修改表字段

以下命令使用了 ALTER 命令及 DROP 子句來刪除以上建立表的 i 字段:

mysql> ALTER TABLE testalter_tbl  DROP i;

若是數據表中只剩餘一個字段則沒法使用DROP來刪除字段。

MySQL 中使用 ADD 子句來向數據表中添加列,以下實例在表 testalter_tbl 中添加 i 字段,並定義數據類型:

mysql> ALTER TABLE testalter_tbl ADD i INT;

執行以上命令後,i 字段會自動添加到數據表字段的末尾。

mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

若是你須要指定新增字段的位置,能夠使用MySQL提供的關鍵字 FIRST (設定位第一列), AFTER 字段名(設定位於某個字段以後)。

嘗試如下 ALTER TABLE 語句, 在執行成功後,使用 SHOW COLUMNS 查看錶結構的變化:

ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;

FIRST 和 AFTER 關鍵字可用於 ADD 與 MODIFY 子句,因此若是你想重置數據表字段的位置就須要先使用 DROP 刪除字段而後使用 ADD 來添加字段並設置位置。


修改字段類型及名稱

若是須要修改字段類型及名稱, 你能夠在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把字段 c 的類型從 CHAR(1) 改成 CHAR(10),能夠執行如下命令:

mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

使用 CHANGE 子句, 語法有很大的不一樣。 在 CHANGE 關鍵字以後,緊跟着的是你要修改的字段名,而後指定新字段名及類型。嘗試以下實例:

mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

ALTER TABLE 對 Null 值和默認值的影響

當你修改字段時,你能夠指定是否包含值或者是否設置默認值。

如下實例,指定字段 j 爲 NOT NULL 且默認值爲100 。

mysql> ALTER TABLE testalter_tbl 
    -> MODIFY j BIGINT NOT NULL DEFAULT 100;

若是你不設置默認值,MySQL會自動設置該字段默認爲 NULL。


修改字段默認值

你能夠使用 ALTER 修改字段的默認值,嘗試如下實例:

mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
| i     | int(11) | YES  |     | 1000    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

你也能夠使用 ALTER 命令及 DROP子句來刪除字段的默認值,以下實例:

mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Changing a Table Type:

修改數據表類型,能夠使用 ALTER 命令及 TYPE 子句來完成。嘗試如下實例,咱們將表 testalter_tbl 的類型修改成 MYISAM :

注意:查看數據表類型能夠使用 SHOW TABLE STATUS 語句。

mysql> ALTER TABLE testalter_tbl ENGINE = MYISAM;
mysql>  SHOW TABLE STATUS LIKE 'testalter_tbl'\G
*************************** 1. row ****************
           Name: testalter_tbl
           Type: MyISAM
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 25769803775
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2007-06-03 08:04:36
    Update_time: 2007-06-03 08:04:36
     Check_time: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

修改表名

若是須要修改數據表的名稱,能夠在 ALTER TABLE 語句中使用 RENAME 子句來實現。

嘗試如下實例將數據表 testalter_tbl 重命名爲 alter_tbl:

mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

注意  : 

alter其餘用途:

修改存儲引擎:修改成myisam

alter table tableName engine=myisam;

刪除外鍵約束:keyName是外鍵別名

alter table tableName drop foreign key keyName;

修改字段的相對位置:這裏name1爲想要修改的字段,type1爲該字段原來類型,first和after二選一,這應該顯而易見,first放在第一位,after放在name2字段後面

alter table tableName modify name1 type1 first|after name2;

 

5五、MySQL 索引

索引分單列索引組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

建立索引時,你須要確保該索引是應用在 SQL 查詢語句的條件(通常做爲 WHERE 子句的條件)。

實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。

更新表時,MySQL不只要保存數據,還要保存一下索引文件。

創建索引會佔用磁盤空間的索引文件。

普通索引

建立索引

CREATE INDEX indexName ON mytable(username(length));

若是是CHAR,VARCHAR類型,length能夠小於字段實際長度;若是是BLOB和TEXT類型,必須指定 length。

修改表結構(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

建立表的時候直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
INDEX [indexName] (username(length))  
 
);

 

惟一索引

它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值。若是是組合索引,則列值的組合必須惟一。它有如下幾種建立方式:

首先建立一個表:create table t1 (id int primary key,username varchar(20),password varchar(20));

建立索引

索引名通常是:表名_字段名

建立單個索引的語法:CREATE INDEX 索引名 on 表名(字段名)

CREATE UNIQUE INDEX indexName ON mytable(username(length))
,

修改表結構

ALTER table mytable ADD UNIQUE [indexName] (username(length))

建立表的時候直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
UNIQUE [indexName] (username(length))  
 
);

給id建立索引:CREATE INDEX t1_id on t1(id);

給username和password建立聯合索引:CREATE index t1_username_password ON t1(username,password);

其中index還能夠替換成unique,primary key,分別表明惟一索引和主鍵索引;

注意 : 索引列的基數越大,數據區分度越高,索引的效果越好。

避免建立過多的索引,索引會額外佔用磁盤空間,下降寫操做效率。

主鍵儘量選擇較短的數據類型,能夠有效減小索引的磁盤佔用提升查詢效率。

一個表只能有一個主鍵索引,可是能夠有多個惟一索引。

主鍵索引必定是惟一索引,惟一索引不是主鍵索引。

聯合索引:將多個列組合在一塊兒建立索引,能夠覆蓋多個列。(也叫複合索引,組合索引)

外鍵索引:只有InnoDB類型的表才能夠使用外鍵索引,保證數據的一致性、完整性、和實現級聯操做(基本不用)。

全文索引:MySQL自帶的全文索引只能用於MyISAM,而且只能對英文進行全文檢索 (基本不用)

 

刪除索引

刪除指定表中指定名稱的索引,語法爲

ALTER TABLE table_name
DROP INDEX index_name;
DROP INDEX [indexName] ON mytable;

例如刪除名稱爲idx_cust_name的索引,其SQL語句爲:

ALTER TABLE customers

DROP INDEX idx_cust_name;

修改索引

在MySQL中並無提供修改索引的直接指令,通常狀況下,咱們須要先刪除掉原索引,再根據須要建立一個同名的索引,從而變相地實現修改索引操做。

--先刪除
ALTER TABLE user
DROP INDEX idx_user_username;
--再以修改後的內容建立同名索引
CREATE INDEX idx_cust_name ON customers (cust_name(8));

查看索引

在MySQL中,要查看某個數據庫表中的索引也很是簡單,只須要使用如下兩個命令中的任意一種便可。

--若是查看索引前,沒有使用user db_name等命令指定具體的數據庫,則必須加上FROM db_name
SHOW INDEX FROM table_name [FROM db_name]
--若是查看索引前,沒有使用user db_name等命令指定具體的數據庫,則必須加上db_name.前綴
SHOW INDEX FROM [db_name.]table_name

 

使用ALTER 命令添加和刪除索引

有四種方式來添加數據表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味着索引值必須是惟一的,且不能爲NULL。

     

  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是惟一的(除了NULL外,NULL可能會出現屢次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現屢次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引爲 FULLTEXT ,用於全文索引。

實例爲在表中添加索引。

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試如下實例刪除索引:

mysql> ALTER TABLE testalter_tbl DROP INDEX c;

使用 ALTER 命令添加和刪除主鍵

主鍵只能做用於一個列上,添加主鍵索引時,你須要確保該主鍵默認不爲空(NOT NULL)。實例以下:

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也能夠使用 ALTER 命令刪除主鍵:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。

顯示索引信息

使用 SHOW INDEX 命令來列出表中的相關的索引信息。能夠經過添加 \G 來格式化輸出信息。

嘗試如下實例:

mysql> SHOW INDEX FROM table_name; \G
........

 

5六、MySQL 臨時表

MySQL 臨時表在咱們須要保存一些臨時數據時是很是有用的。臨時表只在當前鏈接可見,當關閉鏈接時,Mysql會自動刪除表並釋放全部空間。

實例

mysql> CREATE TEMPORARY TABLE SalesSummary (
    -> product_name VARCHAR(50) NOT NULL
    -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
    -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
    -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
    -> (product_name, total_sales, avg_unit_price, total_units_sold)
    -> VALUES
    -> ('cucumber', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber     |      100.25 |          90.00 |                2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)

當你使用 SHOW TABLES命令顯示數據表列表時,你將沒法看到 SalesSummary表。

若是你退出當前MySQL會話,再使用 SELECT命令來讀取原先建立的臨時表數據,那你會發現數據庫中沒有該表的存在,由於在你退出時該臨時表已經被銷燬了。

刪除MySQL 臨時表

默認狀況下,當你斷開與數據庫的鏈接後,臨時表就會自動被銷燬。固然你也能夠在當前MySQL會話使用 DROP TABLE 命令來手動刪除臨時表。

手動刪除臨時表的實例:

mysql> CREATE TEMPORARY TABLE SalesSummary (
    -> product_name VARCHAR(50) NOT NULL
    -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
    -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
    -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO SalesSummary
    -> (product_name, total_sales, avg_unit_price, total_units_sold)
    -> VALUES
    -> ('cucumber', 100.25, 90, 2);

mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber     |      100.25 |          90.00 |                2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE SalesSummary;
mysql>  SELECT * FROM SalesSummary;
ERROR 1146: Table 'RUNOOB.SalesSummary' doesn't exist

 

5七、MySQL 複製表

徹底的複製MySQL的數據表,包括表的結構,索引,默認值等。 若是僅僅使用CREATE TABLE ... SELECT 命令,是沒法實現的。

完整的複製MySQL數據表,步驟以下:

  • 使用 SHOW CREATE TABLE 命令獲取建立數據表(CREATE TABLE) 語句,該語句包含了原數據表的結構,索引等。
  •  
  • 複製如下命令顯示的SQL語句,修改數據表名,並執行SQL語句,經過以上命令 將徹底的複製數據表結構。
  • 若是你想複製表的內容,你就能夠使用 INSERT INTO ... SELECT 語句來實現。

實例

嘗試如下實例來複製表 runoob_tbl 。

步驟一:

獲取數據表的完整結構。

mysql> SHOW CREATE TABLE runoob_tbl \G;
*************************** 1. row ***************************
       Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
  `runoob_id` int(11) NOT NULL auto_increment,
  `runoob_title` varchar(100) NOT NULL default '',
  `runoob_author` varchar(40) NOT NULL default '',
  `submission_date` date default NULL,
  PRIMARY KEY  (`runoob_id`),
  UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB 
1 row in set (0.00 sec)

ERROR:
No query specified

步驟二:

修改SQL語句的數據表名,並執行SQL語句。

mysql> CREATE TABLE `clone_tbl` (
  -> `runoob_id` int(11) NOT NULL auto_increment,
  -> `runoob_title` varchar(100) NOT NULL default '',
  -> `runoob_author` varchar(40) NOT NULL default '',
  -> `submission_date` date default NULL,
  -> PRIMARY KEY  (`runoob_id`),
  -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (1.80 sec)

步驟三:

執行完第二步驟後,你將在數據庫中建立新的克隆表 clone_tbl。 若是你想拷貝數據表的數據你能夠使用INSERT INTO... SELECT 語句來實現。

mysql> INSERT INTO clone_tbl (runoob_id,
    ->                        runoob_title,
    ->                        runoob_author,
    ->                        submission_date)
    -> SELECT runoob_id,runoob_title,
    ->        runoob_author,submission_date
    -> FROM runoob_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

執行以上步驟後,你將完整的複製表,包括表結構及表數據。

另外一種完整複製表的方法 :

CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;

其餘:

能夠拷貝一個表中其中的一些字段:

CREATE TABLE newadmin AS
(
    SELECT username, password FROM admin
)

能夠將新建的表的字段更名:

CREATE TABLE newadmin AS
(  
    SELECT id, username AS uname, password AS pass FROM admin
)

能夠拷貝一部分數據:

CREATE TABLE newadmin AS
(
    SELECT * FROM admin WHERE LEFT(username,1) = 's'
)

能夠在建立表的同時定義表中的字段信息:

CREATE TABLE newadmin
(
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
AS
(
    SELECT * FROM admin
)

注意  :       

區分下mysql複製表的兩種方式。

第1、只複製表結構到新表

create table 新表 select * from 舊錶 where 1=2

或者

create table 新表 like 舊錶 

第2、複製表結構及數據到新表

create table新表 select * from 舊錶 

 

5八、MySQL 序列使用

mySQL 序列是一組整數:1, 2, 3, ...,因爲一張數據表只能有一個字段自增主鍵, 若是你想實現其餘字段也實現自動增長,就能夠使用MySQL序列來實現。

使用 AUTO_INCREMENT

MySQL 中最簡單使用序列的方法就是使用 MySQL AUTO_INCREMENT 來定義列。

實例

如下實例中建立了數據表 insect, insect 表中 id 無需指定值可實現自動增加。

mysql> CREATE TABLE insect
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, # type of insect
    -> date DATE NOT NULL, # date collected
    -> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO insect (id,name,date,origin) VALUES
    -> (NULL,'housefly','2001-09-10','kitchen'),
    -> (NULL,'millipede','2001-09-10','driveway'),
    -> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id | name        | date       | origin     |
+----+-------------+------------+------------+
|  1 | housefly    | 2001-09-10 | kitchen    |
|  2 | millipede   | 2001-09-10 | driveway   |
|  3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)

獲取AUTO_INCREMENT值

在MySQL的客戶端中你能夠使用 SQL中的LAST_INSERT_ID( ) 函數來獲取最後的插入表中的自增列的值。

重置序列

若是你刪除了數據表中的多條記錄,並但願對剩下數據的AUTO_INCREMENT列進行從新排列,那麼你能夠經過刪除自增的列,而後從新添加來實現。 不過該操做要很是當心,若是在刪除的同時又有新記錄添加,有可能會出現數據混亂。操做以下所示:

mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
    -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
    -> ADD PRIMARY KEY (id);

設置序列的開始值

通常狀況下序列的開始值爲1,但若是你須要指定一個開始值100,那咱們能夠經過如下語句來實現:

mysql> CREATE TABLE insect
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, 
    -> date DATE NOT NULL,
    -> origin VARCHAR(30) NOT NULL
)engine=innodb auto_increment=100 charset=utf8;

或者你也能夠在表建立成功後,經過如下語句來實現:

mysql> ALTER TABLE t AUTO_INCREMENT = 100;

 

5九、MySQL 處理重複數據

防止表中出現重複數據

在 MySQL 數據表中設置指定的字段爲 PRIMARY KEY(主鍵) 或者 UNIQUE(惟一) 索引來保證數據的惟一性。

實例:下表中無索引及主鍵,因此該表容許出現多條重複記錄。

CREATE TABLE person_tbl
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);

若是想設置表中字段 first_name,last_name 數據不能重複,能夠設置雙主鍵模式來設置數據的惟一性, 若是設置了雙主鍵,那麼那個鍵的默認值不能爲 NULL,可設置爲 NOT NULL。以下所示:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

若是設置了惟一索引,那麼在插入重複數據時,SQL 語句將沒法執行成功,並拋出錯。

INSERT IGNORE INTO 與 INSERT INTO 的區別就是 INSERT IGNORE 會忽略數據庫中已經存在的數據,若是數據庫沒有數據,就插入新的數據,若是有數據的話就跳過這條數據。這樣就能夠保留數據庫中已經存在數據,達到在間隙中插入數據的目的。

如下實例使用了 INSERT IGNORE INTO,執行後不會出錯,也不會向數據表中插入重複數據:

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)

INSERT IGNORE INTO 當插入數據時,在設置了記錄的惟一性後,若是插入重複數據,將不返回錯誤,只以警告形式返回。 而 REPLACE INTO 若是存在 primary 或 unique 相同的記錄,則先刪除掉。再插入新記錄。

另外一種設置數據的惟一性方法是添加一個 UNIQUE 索引,以下所示:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   UNIQUE (last_name, first_name)
);

統計重複數據

如下將統計表中 first_name 和 last_name的重複記錄數:

mysql> SELECT COUNT(*) as repetitions, last_name, first_name
    -> FROM person_tbl
    -> GROUP BY last_name, first_name
    -> HAVING repetitions > 1;

以上查詢語句將返回 person_tbl 表中重複的記錄數。 通常狀況下,查詢重複的值,請執行如下操做:

  • 肯定哪一列包含的值可能會重複。
  • 在列選擇列表使用COUNT(*)列出的那些列。
  • 在GROUP BY子句中列出的列。
  • HAVING子句設置重複數大於1。

過濾重複數據

若是你須要讀取不重複的數據能夠在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重複數據。

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

也能夠使用 GROUP BY 來讀取數據表中不重複的數據:

mysql> SELECT last_name, first_name
    -> FROM person_tbl
    -> GROUP BY (last_name, first_name);

刪除重複數據

若是你想刪除數據表中的重複數據,你能夠使用如下的SQL語句:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

固然也能夠在數據表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重複記錄。方法以下:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);
select 列名1,count(1) as count 
from 表名
group by  列名1
having count>1  and 其餘條件

select 列名1,列名2,count(1) as count 
from 表名
group by  列名1,列名2 
having count>1  and 其餘條件

原理:先按照要查詢出現重複數據的列,進行分組查詢。count > 1 表明出現 2 次或 2 次以上。

示例:

/*查詢重複數據*/
select serialnum,cdate,count(*) as count 
from m_8_customer_temp_20180820bak 
group by serialnum,cdate having  count>1 and cdate>='2018-08-20 00:00:00';

60、MySQL 排序咱們知道從 MySQL 表中使用 SQL SELECT 語句來讀取:

MySQL 拼音排序

若是字符集採用的是 gbk(漢字編碼字符集),直接在查詢語句後邊添加 ORDER BY:

SELECT * 
FROM runoob_tbl
ORDER BY runoob_title;

若是字符集採用的是 utf8(萬國碼),須要先對字段進行轉碼而後排序:

SELECT * 
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk);

 

6一、建立數據表 runoob_test_tbl

mysql> use RUNOOB;

Database changed

mysql> create table runoob_test_tbl 

    -> (

    -> runoob_author varchar(40) NOT NULL,

   -> runoob_count INT -> );

Query OK, 0 rows affected (0.05 sec)

mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('RUNOOB', 20);

mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('菜鳥教程', NULL);

mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('Google', NULL);

mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('FK', 20);

mysql> select * from runoob_test_tbl;

+------------------+-------------------+

|  runoob_author  |   runoob_count  |

+---------------+---------------------+

|   RUNOOB           |   20                     |

|   菜鳥教程            |  NULL                  |

|   Google              | NULL                   |

| FK | 20 |

+------------------+------------------+

4 rows in set (0.01 sec)

查找數據表中 runoob_test_tbl 列是否爲 NULL,必須使用 IS NULL 和 IS NOT NULL,以下實例:

mysql> select * from runoob_test_tbl WHERE runoob_count IS NULL;

+----------------+----------------+

| runoob_author | runoob_count  |

+-----------------+----------------+

| 菜鳥教程 | NULL |

| Google | NULL |

+---------------+------------------+

2 rows in set (0.01 sec)

mysql> select * from runoob_test_tbl WHERE runoob_count IS NOT NULL;

+----------------+-----------------+

| runoob_author | runoob_count |

+----------------+----------------+

|   RUNOOB       |   20                  |

|   FK                  |   20                  |

+----------------+---------------+

2 rows in set (0.01 sec)

 

6二、MySQL 及 SQL 注入

SQL注入,就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

咱們永遠不要信任用戶的輸入,咱們必須認定用戶輸入的數據都是不安全的,咱們都須要對用戶輸入的數據進行過濾處理。

實例中,輸入的用戶名必須爲字母、數字及下劃線的組合,且用戶名長度爲 8 到 20 個字符之間:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 輸入異常";
}

讓咱們看下在沒有過濾特殊字符時,出現的SQL狀況:

// 設定$name 中插入了咱們不須要的SQL語句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

沒有對 $name 的變量進行過濾,$name 中插入了咱們不須要的SQL語句,將刪除 users 表中的全部數據。

在PHP中的 mysqli_query() 是不容許執行多個 SQL 語句的,可是在 SQLite 和 PostgreSQL 是能夠同時執行多條SQL語句的,因此咱們對這些用戶的數據須要進行嚴格的驗證。

 

6三、MySQL 導出數據

使用 SELECT ... INTO OUTFILE 語句導出數據

如下實例中咱們將數據表 runoob_tbl 數據導出到 /tmp/runoob.txt 文件中 :

mysql> SELECT * FROM runoob_tbl 
    -> INTO OUTFILE '/tmp/runoob.txt';

你能夠經過命令選項來設置數據輸出的指定格式,如下實例爲導出 CSV 格式:

mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'
    -> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    -> LINES TERMINATED BY '\r\n';

在下面的例子中,生成一個文件,各值用逗號隔開。這種格式能夠被許多程序使用。

SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;

導出表做爲原始數據

mysqldump 是 mysql 用於轉存儲數據庫的實用程序。它主要產生一個 SQL 腳本,其中包含從頭從新建立數據庫所必需的命令 CREATE TABLE INSERT 等。

使用 mysqldump 導出數據須要使用 --tab 選項來指定導出文件指定的目錄,該目標必須是可寫的。

如下實例將數據表 runoob_tbl 導出到 /tmp 目錄中:

$ mysqldump -u root -p --no-create-info \
            --tab=/tmp RUNOOB runoob_tbl
password ******

導出 SQL 格式的數據

導出 SQL 格式的數據到指定文件,以下所示:

$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
password ******

以上命令建立的文件內容以下:

-- MySQL dump 8.23
--
-- Host: localhost    Database: RUNOOB
---------------------------------------------------------
-- Server version       3.23.58

--
-- Table structure for table `runoob_tbl`
--

CREATE TABLE runoob_tbl (
  runoob_id int(11) NOT NULL auto_increment,
  runoob_title varchar(100) NOT NULL default '',
  runoob_author varchar(40) NOT NULL default '',
  submission_date date default NULL,
  PRIMARY KEY  (runoob_id),
  UNIQUE KEY AUTHOR_INDEX (runoob_author)
) TYPE=MyISAM;

--
-- Dumping data for table `runoob_tbl`
--

INSERT INTO runoob_tbl 
       VALUES (1,'Learn PHP','John Poul','2007-05-24');
INSERT INTO runoob_tbl 
       VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
INSERT INTO runoob_tbl 
       VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');

若是你須要導出整個數據庫的數據,能夠使用如下命令:

$ mysqldump -u root -p RUNOOB > database_dump.txt
password ******

若是須要備份全部數據庫,能夠使用如下命令:

$ mysqldump -u root -p --all-databases > database_dump.txt
password ******

--all-databases 選項在 MySQL 3.23.12 及之後版本加入。

該方法可用於實現數據庫的備份策略。

將數據表及數據庫拷貝至其餘主機

在源主機上執行如下命令,將數據備份至 dump.txt 文件中:

$ mysqldump -u root -p database_name table_name > dump.txt
password *****

若是完整備份數據庫,則無需使用特定的表名稱。

若是你須要將備份的數據庫導入到MySQL服務器中,能夠使用如下命令,使用如下命令你須要確認數據庫已經建立:

$ mysql -u root -p database_name < dump.txt
password *****

你也能夠使用如下命令將導出的數據直接導入到遠程的服務器上,但請確保兩臺服務器是相通的,是能夠相互訪問的:

$ mysqldump -u root -p database_name \
       | mysql -h other-host.com database_name

以上命令中使用了管道來將導出的數據導入到指定的遠程主機上。

 

a、導出數據庫(沒有數據)
mysqldump -uroot -p123456 --opt --add-drop-table --add-drop-database -d -B db >db.nodata.sql   //-d no data;
mysqldump -uroot -p123456 --opt --add-drop-table --add-drop-database -B db >db.sql  //struct and data
b、查詢數據庫中記錄不爲空的表
use information_schema;
select * from TABLES where TABLE_ROWS>0 AND TABLE_SCHEMA='db';
mysqldump -uroot -p123456  db version >db-version.sql    //導出db數據庫version表的結構和數據
        d、mysql跨庫查詢(連庫查詢)
                select subscriber.username,subscriber.password, member.email from db.subscriber,db2.member where subscriber.username=member.id and member.book_id='193' limit 20;
                select subscriber.username,subscriber.password, member.email,member.book_id from db.subscriber,db2.member where subscriber.username=member.id and member.book_id='193';

 

6四、MySQL 導入數據

一、mysql 命令導入

使用 mysql 命令導入語法格式爲:

mysql -u用戶名    -p密碼    <  要導入的數據庫數據(runoob.sql)

實例:

# mysql -uroot -p123456 < runoob.sql

以上命令將將備份的整個數據庫 runoob.sql 導入。


二、source 命令導入

source 命令導入數據庫須要先登陸到數庫終端:

mysql> create database abc;      # 建立數據庫
mysql> use abc;                  # 使用已建立的數據庫 
mysql> set names utf8;           # 設置編碼
mysql> source /home/abc/abc.sql  # 導入備份數據庫

三、使用 LOAD DATA 導入數據

MySQL 中提供了LOAD DATA INFILE語句來插入數據。 如下實例中將從當前目錄中讀取文件 dump.txt ,將該文件中的數據插入到當前數據庫的 mytbl 表中。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

 若是指定LOCAL關鍵詞,則代表從客戶主機上按路徑讀取文件。若是沒有指定,則文件在服務器上按路徑讀取文件。

能明確地在LOAD DATA語句中指出列值的分隔符和行尾標記,可是默認標記是定位符和換行符。

兩個命令的 FIELDS 和 LINES 子句的語法是同樣的。兩個子句都是可選的,可是若是兩個同時被指定,FIELDS 子句必須出如今 LINES 子句以前。

若是用戶指定一個 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可選的,不過,用戶必須至少指定它們中的一個。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
  -> FIELDS TERMINATED BY ':'
  -> LINES TERMINATED BY '\r\n';

LOAD DATA 默認狀況下是按照數據文件中列的順序插入數據的,若是數據文件中的列與插入表中的列不一致,則須要指定列的順序。

如,在數據文件中的列順序是 a,b,c,但在插入表的列順序爲b,c,a,則數據導入語法以下:

mysql> LOAD DATA LOCAL INFILE 'dump.txt' 
    -> INTO TABLE mytbl (b, c, a);

四、使用 mysqlimport 導入數據

mysqlimport客戶端提供了LOAD DATA INFILEQL語句的一個命令行接口。mysqlimport的大多數選項直接對應LOAD DATA INFILE子句。

從文件 dump.txt 中將數據導入到 mytbl 數據表中, 能夠使用如下命令:

$ mysqlimport -u root -p --local database_name dump.txt
password *****

mysqlimport命令能夠指定選項來設置指定格式,命令語句格式以下:

$ mysqlimport -u root -p --local --fields-terminated-by=":" \
   --lines-terminated-by="\r\n"  database_name dump.txt
password *****

mysqlimport 語句中使用 --columns 選項來設置列的順序:

$ mysqlimport -u root -p --local --columns=b,c,a \
    database_name dump.txt
password *****

http://www.runoob.com/mysql/mysql-database-import.html

 

6五、建立存儲過程

執行存儲過程

使用CALL子句執行存儲過程,CALL子句接受存儲過程的名稱以及須要傳遞的參數。

CALL ordertotal(1,TRUE,@total);
SELECT @total;

若是存儲過程當中定義了OUT類型的輸入參數,那麼在執行存儲過程時須要傳入變量,如這裏@total,而且變量都是用@開始的。若是存儲過程當中沒有參數的話,就用空圓括號表示便可,CALL ordertotal();

刪除存儲過程

刪除存儲過程,能夠使用DROP PROCEDURE子句。如DROP PROCEDURE ordertotal;

查詢存儲過程

一、顯示建立一個存儲過程的語句,能夠使用SHOW CREATE PROCEDURE。如SHOW CREATE PROCEDURE ordertotal;

二、查詢全部存儲過程的狀態,若是在定義存儲過程當中使用COMMENT添加註釋,能夠查看。同時能夠LIKE進行過濾結果。如SHOW PROCEDURE STATUS LIKE '%order%'

 

6六、事務處理

什麼是事務?

  • 事務處理用來維護數據庫的完整性,它保證成批的MySQL操做要麼徹底執行,要麼徹底不執行。事務處理是一種機制,用來管理必須成批執行的MySQL操做,它們要麼時做爲總體執行或者徹底不執行。

關鍵概念:

  • 事務:是指一組SQL語句

  • 回退:是指撤銷指定的SQL語句的過程;

  • 提交:指將未存儲的SQL語句的結果寫入數據庫表中

  • 保留點:指事務處理中設置的臨時佔位符,能夠對它發佈回退。

如何建立執行事務?

START TRANSACTION;
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);
SELECT * FROM customers;
SAVEPOINT insertinto;
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
ROLLBACK TO insertinto;

執行結果爲:插入數據('1',5,18)有效,由於,只會從保留點SAFEPOINT以後開始回退,也就是說保留點SAFEPOINT以前的SQL語句執行的結果仍然有效。

有這樣一些細節:

  • START TRANSACTION用來表示下面的SQL語句集爲一段事務;

  • SAFEPOINT 用於指定保留點insertinto;

  • ROLLBACK TO表示從指定保留點開始回退,也就是說保留點以前的SQL語句執行結果依然有效。若是僅僅使用ROLLBACK進行回退的話就表示從STAET TRANSACTION以後全部的SQL語句執行效果都會撤銷。

MySQL提交(寫或保存)操做是自動進行的,這稱之爲隱含提交。可是在事務處理塊中,提交不會隱含進行,要使用COMMIT子句進行提交。如:

START TRANSACTION;
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
COMMIT;

採用COMMIT提交事務,若是兩條SQL語句都執行成功,纔會將數據都寫入表中。

 

6七、觸發器

什麼是觸發器?

  • 當某條SQL語句發生時,自動執行某些其餘的SQL語句的時候就須要使用到觸發器。觸發器只能響應DELETE、INSERT、UPDATE這三個特定操做。

  • MySQL建立觸發器首先要建立觸發器中待存儲的表,而後再設定觸發器被激活的時刻,最後在知足定義條件時觸發,並執行觸發器中定義的語句集合

如何建立觸發器?建立觸發器時須要給出最重要的四條信息:

  • 全局惟一的觸發器名;

  • 觸發器關聯的表;

  • 觸發器在什麼時候執行(操做執行以前或者以後);

  • 觸發器應該響應的活動(DELETE、INSERT或者UPDATE)。

建立觸發器的語法以下:

1

2

3

CREATE <觸發器名> < BEFORE | AFTER >

<INSERT | UPDATE | DELETE >

ON <表名> FOR EACH Row<觸發器主體>

因爲觸發器只能響應特定的三種類型的操做,所以可建立的觸發器也就三種類型:INSERT觸發器,DELETE觸發器以及UPDATE觸發器。

/*建立觸發器*/
CREATE TRIGGER insertcustomers AFTER INSERT ON customers
FOR EACH ROW SELECT NEW.cust_id INTO @newinsertid;

/*執行觸發器*/
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
SELECT @newinsertid;

INSERT | UPDATE | DELETE

表示觸發事件,用於指定激活觸發器的語句的種類

INSERT:將新行插入表時激活觸發器

DELETE: 從表中刪除某一行數據時激活觸發器

UPDATE:更改表中某一行數據時激活觸發器

注意 : 

INSERT觸發器

  • 使用create trigger來建立觸發器;

  • after insert代表在插入行數據以後,觸發器纔會執行特徵操做;

  • for each row 表示對插入的每一行數據,觸發器都起做用;

  • 針對insert觸發器,能夠使用虛擬表new,來使用剛插入的行數據。好比例子中,select NEW.cust_id into @newinsertid表示將新插入的行數據的id賦值給變量@newinsertid。

DELETE觸發器

DELETE觸發器在DELETE語句執行以前或者以後,須要知道如下兩點:

  • 在DELETE觸發器代碼內,能夠引用一個名爲OLD的虛擬表,來訪問被刪除的行;

  • OLD表中的數據只能讀,不能被更新,而在INSERT觸發器中,就能夠經過NEW來更新被插入的行數據。

例如,針對customers表,當刪除一行數據時,返回被刪除數據的cust_id以及cust_name:

/*建立DELETE觸發器*/

DELIMITER //
CREATE TRIGGER insertcustomers AFTER DELETE ON customers
FOR EACH ROW 
BEGIN 
  SELECT OLD.cust_name INTO @deletecustname;
  SELECT OLD.cust_id INTO @deletecustid;
END //

/*調用DELETE觸發器*/
DELETE FROM customers WHERE cust_id = 3;
SELECT @deletecustname;
SELECT @deletecustid;

基本上與建立INSERT觸發器同樣,只不過在DELETE觸發器中只能使用OLD來訪問被刪除的行數據。

UPDATE觸發器

UPDATE觸發器在UPDATE語句執行以前或者以後執行,須要知道一下幾點:

  • 在BEFORE UPDATE觸發器中能夠使用NEW和OLD來訪問數據,而在AFTER UPDATE觸發器中使用NEW來訪問數據會報錯,只能使用OLD來訪問數據;

  • 在BEFORE UPDATE觸發器中,NEW中的值能夠被改變,即容許更改將用於UPDATE的數據;

  • OLD中的行數據只能讀,不能被更新。

一個UPDATE觸發器示例以下:

/*建立UPDATE觸發器*/

DELIMITER //
CREATE TRIGGER insertcustomers BEFORE UPDATE ON customers
FOR EACH ROW 
BEGIN 

SELECT NEW.cust_name INTO @beforeupdate;
SET NEW.cust_name = 'reset_name';
SELECT OLD.cust_name INTO @afterupdate;
END //

/*調用UPDATE觸發器*/
UPDATE customers SET cust_name = 'happy' WHERE cust_id = 5;
SELECT @beforeupdate;
SELECT @afterupdate;

輸出爲@beforeupdate爲‘happay’,而@afterupdate爲'reset_name'。有這樣一些細節:

  • NEW虛擬表中的數據能夠更改,如這裏採用SET NEW.cust_name = 'reset_name';,將待更新的cust_name由「happy」變成了「reset_name」;

  • 在BEFORE UPDATE觸發器中能夠使用NEW和OLD來訪問數據,而在AFTER UPDATE觸發器中使用NEW來訪問數據會報錯。

刪除觸發器?

  • 刪除觸發器,能夠使用 DROP TRIGGER語句,好比DROP TRIGGER insertcustomers。觸發器不能更新或者覆蓋,若是要修改觸發器,必須刪除這個觸發器。

 

6八、索引使用策略及優化

一、建立索引

  • 在常常查詢而不常常增刪改操做的字段加索引。

  • order by與group by後應直接使用字段,並且字段應該是索引字段。

  • 一個表上的索引不該該超過6個。

  • 索引字段的長度固定,且長度較短。

  • 索引字段重複不能過多,若是某個字段爲主鍵,那麼這個字段不用設爲索引。

  • 在過濾性高的字段上加索引。

二、使用索引注意事項

  • 使用like關鍵字時,前置%會致使索引失效。

  • 使用null值會被自動從索引中排除,索引通常不會創建在有空值的列上。

  • 使用or關鍵字時,or左右字段若是存在一個沒有索引,有索引字段也會失效。

  • 使用!=操做符時,將放棄使用索引。由於範圍不肯定,使用索引效率不高,會被引擎自動改成全表掃描。

  • 不要在索引字段進行運算。

  • 在使用複合索引時,最左前綴原則,查詢時必須使用索引的第一個字段,不然索引失效;而且應儘可能讓字段順序與索引順序一致。

  • 避免隱式轉換,定義的數據類型與傳入的數據類型保持一致。

 

6九、修改MySQL默認字符集

修改/etc/my.cnf如下位置

[mysqld] 
character-set-server=utf8
collation-server=utf8_general_ci
[client] 
default-character-set=utf8

修改MYSQL默認類型爲MYISAM

修改/etc/my.cnf文件,在[mysqld]下增長一句,同理可修改類型爲INNODB 。

default-storage-engine=MYISAM

>show global variables like '%timeout'          #查看數據庫相關的時間。

 

70、使用 mysqladmin 工具建立和刪除

在命令行環境下能夠使用 mysqladmin 建立和刪除數據庫。
建立數據庫:
shell> mysqladmin create db_name

刪除數據庫:
shell> mysqladmin drop db_name

若是出現下面的錯誤
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user: 'root@localhost' (Using password: YES)'
表示你須要一個能夠正常鏈接的用戶,請指定-u -p 選項,具體方法與 3.2 節介紹相同,在第七章中你將會學到用戶受權的知識。

 

shell>mysqladmin -u root -p shutdown
Enter Password:***********

shell>mysqladmin -u root -p shutdown
Enter Password:***********

輸入修改過的密碼便可。

 

7一、開啓慢查詢日誌

方法一 :

// 查詢是否開啓慢查詢 ON OR OFF
show variables like 'log_slow_queries'
// 查詢是否開啓慢查詢日誌 ON OR OFF
show variables like 'show_query_log'
// 指定慢查詢日誌的存儲位置 目錄要具備寫權限
set global show_query_log_file = '/home/mysql/sql_log/mysql-slow.log'
// 把沒有使用索引的sql記錄到慢查詢日誌中 若是table的數據量小,不建議開啓該條設置,由於會記錄全部沒有用到索引的查詢,會給日誌填充不少垃圾信息
set global log_queries_not_using_indexes = on;
// 超過1秒鐘查詢記錄到慢查詢日誌中
set global long_query_time = 1;
 

方法二 : 

經過my.ini開啓慢查詢日誌(原理和用命令同樣),不過配置完成須要重啓MySQL目錄要具備寫權限
log-slow-queries = '/home/mysql/sql_log/mysql-slow.log'
// 在windows的狀況下須要絕對路徑
log-slow-queries = 'C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-slow.log'
long_query_time = 1
log-queries-not-using-indexes = on


慢查詢日誌所包含的內容
// 執行SQL的主機信息:ROOT用戶在本地所執行的查詢
# User@Host: root['root'] @ localhost []
// SQL的執行信息 查詢時間、鎖定時間、發送行數、掃描行數
# Query_time:0.000024 Lock_time:0.0000000 Rows_sent:0 Rows_examined:0
// SQL執行時間 時間戳
# SET timestamp = 1402389328;
// SQL的內容
# select CONCAT('storage engine:',@@storage_engine) as INFO;

慢查詢日誌分析工具
    工具1:mysqldumpslow(官方工具) 通常集成在MySQL安裝包中
    直接使用mysqldumpslow命令便可使用

    工具2:pt-query-digest工具
    輸入命令系統提示沒有的話能夠查找安裝一下

    工具3:本身寫腳本將日誌中的語句列出來,經過網頁的形式查看

 

7二、配置主從同步

  1. #啓動端口爲3506的實例

  2. [mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3506/data3506/my3506.cnf &

  3. [mysql@app ~]$ msyql -P3506


slave@localhost[(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3506  |
+---------------+-------+

#爲從庫添加指向主庫的相關配置信息,該命令會生成及修改備庫上的master.info及relay-log.info文件
slave@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.163.130',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='repl',
    -> MASTER_PORT=3406,
    -> MASTER_LOG_FILE='inst3406bin.000001',
    -> MASTER_LOG_POS=0;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
 
#出現了2個warnings,查看一下
slave@localhost[(none)]> show warnings \G
*************************** 1. row ******

#此時查看從庫的狀態信息

  1. Slave_IO_Running: No #IO線程沒有運行

  2. Slave_SQL_Running: No #SQL線程沒有運行

  3. 能夠看到從庫上的2個線程,一個是用於I/O線程,用於鏈接到主庫請求主庫發送binlog,一個是用於執行SQL的SQL線程。

slave@localhost[(none)]> start slave;                     #啓動slave

robin@localhost[(none)]> show slave status\G            #再次查看slave的狀態

 

slave@localhost[(none)]> show processlist\G                             #

 

7三、修改mysql的密碼:

 1: 以下命令,在初次開啓mysql服務後,會提示給用戶:

#mysqladmin -u root password '123';

若是已經有密碼存在,要修改的話:

#mysqladmin -u root -p password 'new_pwd'; 

以後輸入舊密碼回車便可

2. set password for 'root'@'主機名'=password('密碼');

3.alter user'root'@'localhost' identified by '123';

4. grant all on*.* to 'username'@'localhost'identified by 'password';

注意:grant select on *.* to dba@localhost; dba能夠查詢 MySQL中全部數據庫中的表。 

grant all on*.* to dba@localhost; dba能夠

管理 MySQL中的全部數據庫。

 

7四、mysql遠程訪問修改密碼:

1.執行以下命令設置MySQL數據庫的遠程訪問。

mysql> grant all on *.* to 'root'@'%' identified by '111111';

mysql> flush privileges;

2.修改db.propertie文件的密碼。

2.1修改 /mnt/datapool/msconf/db.propertie中的host的password,改爲新password。   

2.2修改當前相似雲盤這類程序的配置db.properties文件修改密碼,同上面1的操做差很少。

/Loongdisk/managerservice/db.properties的將host的password,改爲新password。


7五、受權

建立一個能夠從任何地方鏈接到服務器的一個超管帳戶,必須分配一個密碼
mysql> grant all privileges on *.* to 'user_name'@'localhost' identified by  'password' ;
格式:grant select on 數據庫.* to 用戶名@登陸主機 identified by 「密碼」

刪除受權:
mysql> revoke all privileges on *.* from root@」%」;
mysql> delete from user where user=」root」 and host=」%」;
mysql> flush privileges;

重命名錶:
mysql > alter table t1 rename t2;

備份:
mysqldump -hhostname -uusername -ppassword databasename > backup.sql;

恢復:
mysql -hhostname -uusername -ppassword databasename< backup.sql;

7六、mysql表內容操做

一、增

insert into 表 (列名,列名...) values (值,值,...)

insert into 表 (列名,列名...) values (值,值,...),(值,值,值...)

insert into 表 (列名,列名...) select (列名,列名...) from 表

例:

    insert into tab1(name,email) values('zhangyanlin','zhangyanlin8851@163.com')

二、刪

delete from 表                                      # 刪除表裏所有數據

delete from 表 where id=1 and name='zhangyanlin'   # 刪除ID =1 和name='zhangyanlin' 那一行數據

三、改

update 表 set name = 'zhangyanlin' where id>1

四、查

select * from 表

select * from 表 where id > 1

select nid,name,gender as gg from 表 where id > 1

 

7七、條件語句

條件判斷where

通配符like

限制limit

排序asc,desc

分組group by

 

7八、修改表

添加列:   

alter table 表名 add 列名 類型

刪除列:   

alter table 表名 drop column 列名

修改列:
          
alter table 表名 modify column 列名 類型;  -- 類型
alter table 表名 change 原列名 新列名 類型; -- 列名,類型

添加主鍵:
          
alter table 表名 add primary key(列名);

刪除主鍵:
          
alter table 表名 drop primary key;
alter table 表名  modify  列名 int, drop primary key;

添加外鍵: 

alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段);

刪除外鍵: 

alter table 表名 drop foreign key 外鍵名稱

修改默認值:

ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

刪除默認值:

ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

對於上述這些操做是否是看起來很麻煩,很浪費時間,別慌!有專門的軟件能提供這些功能,操做起來很是簡單,這個軟件名字叫Navicat Premium ,你們自行在網上下載,練練手,可是下面的即將講到表內容操做仍是建議本身寫命令來進行

 

分析工具

性能,結構和數據分析工具

  • Anemometer – 一個 SQL 慢查詢監控器。

     

  • innodb-ruby – 一個對 InooDB 格式文件的解析器,用於 Ruby 語言。

     

  • innotop – 一個具有多種特性和可擴展性的 MySQL 版 ‘top’ 工具。

     

  • pstop – 一個針對 MySQL 的類 top 程序,用於收集,彙總以及展現來自 performance_schema 的信息。

     

  • mysql-statsd – 一個收集 MySQL 信息的 Python 守護進程,並經過 StatsD 發送到 Graphite。

備份

備份/存儲/恢復 工具

  • MyDumper – 邏輯的,並行的 MySQL 備份/轉儲工具。

     

  • MySQLDumper – 基於 web 的開源備份工具-對於共享虛擬主機很是有用。

     

  • mysqldump-secure – 將加密,壓縮,日誌,黑名單和 Nagios 監控一體化的 mysqldump 安全腳本。

     

  • Percona Xtrabackup – 針對 MySQL 的一個開源熱備份實用程序——在服務器的備份期間不會鎖定你的數據庫。

性能測試

給你的服務器進行壓測的工具

  • iibench-mysql -基於 Java 的 MySQL/Percona/MariaDB 索引進行插入性能測試工具。

     

  • Sysbench – 一個模塊化,跨平臺以及多線程的性能測試工具。

 

7九、慢查詢日誌

有時候若是線上請求超時,應該去關注下慢查詢日誌,慢查詢的分析很簡單,先找到慢查詢日誌文件的位置,而後利用mysqldumpslow去分析。查詢慢查詢日誌信息能夠直接經過執行sql命令查看相關變量,經常使用的sql以下:

-- 查看慢查詢配置

-- slow_query_log  慢查詢日誌是否開啓

-- slow_query_log_file 的值是記錄的慢查詢日誌到文件中

-- long_query_time 指定了慢查詢的閾值

-- log_queries_not_using_indexes 是否記錄全部沒有利用索引的查詢

SHOW VARIABLES LIKE '%quer%';

 

-- 查看慢查詢是日誌仍是表的形式

SHOW VARIABLES LIKE 'log_output'

 

-- 查看慢查詢的數量

SHOW GLOBAL STATUS LIKE 'slow_queries';

mysqldumpslow的工具十分簡單,我主要用到的是參數以下:

  • -t:限制輸出的行數,我通常取前十條就夠了

  • -s:根據什麼來排序默認是平均查詢時間at,我還常常用到c查詢次數,由於查詢次數很頻繁可是時間不高也是有必要優化的,還有t查詢時間,查看那個語句特別卡。

  • -v:輸出詳細信息

例子:mysqldumpslow -v -s t -t 10 mysql_slow.log.2018-11-20-0500

 

80、

 

常見問題 :

一、delete,drop,truncate 都有刪除表的做用,區別在於:

  • 一、delete 和 truncate 僅僅刪除表數據drop 連表數據和表結構一塊兒刪除,打個比方,delete 是單殺,truncate 是團滅,drop 是把電腦摔了。
  •  二、delete 是 DML 語句,操做完之後若是沒有不想提交事務還能夠回滾,truncate 和 drop 是 DDL 語句,操做完立刻生效,不能回滾,打個比方,delete 是發微信說分手,後悔還能夠撤回,truncate 和 drop 是直接扇耳光說滾,不能反悔。
  •  三、執行的速度上,drop>truncate>delete,打個比方,drop 是神舟火箭,truncate 是和諧號動車,delete 是自行車。

 

二、like 匹配/模糊匹配,會與 % 和 _ 結合使用。

'%a'     //以a結尾的數據
'a%'     //以a開頭的數據
'%a%'    //含有a的數據
'_a_'    //三位且中間字母是a的
'_a'     //兩位且結尾字母是a的
'a_'     //兩位且開頭字母是a的

查詢以 java 字段開頭的信息。

SELECT * FROM position WHERE name LIKE 'java%';

查詢包含 java 字段的信息。

SELECT * FROM position WHERE name LIKE '%java%';

查詢以 java 字段結尾的信息。

SELECT * FROM position WHERE name LIKE '%java';

 

三、UNION 語句:用於將不一樣表中相同列中查詢的數據展現出來;(不包括重複數據)

UNION ALL 語句:用於將不一樣表中相同列中查詢的數據展現出來;(包括重複數據)

使用形式以下:

SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;

四、group by 能夠實現一個最簡單的去重查詢,假設想看下有哪些員工,除了用 distinct,還能夠用:

SELECT name FROM employee_tbl GROUP BY name;

返回的結果集就是全部員工的名字。

分組後的條件使用 HAVING 來限定,WHERE 是對原始數據進行條件限制。幾個關鍵字的使用順序爲 where 、group by 、having、order by ,例如:

SELECT name ,sum(*)  FROM employee_tbl WHERE id<>1 GROUP BY name  HAVING sum(*)>5 ORDER BY sum(*) DESC;

五、直接切還到某一個數據庫 :mysql -u -pxxxxxxx -D db1(數據庫) -o

 

六、MYSQL返回值的意思 ? 

  • 容許NULL值,則說明在插入行數據時容許不給出該列的值,而NOT NULL則表示在插入或者更新該列數據,必須明確給出該列的值;

  • DEFAULT表示該列的默認值,在插入行數據時,若沒有給出該列的值就會使用其指定的默認值;

  • PRIMARY KEY用於指定主鍵,主鍵能夠指定一列數據,而能夠由多列數據組合構成,如PRIMARY KEY(cust_id,cust_name);

  • ENGINE用於指定引擎類型。常見的引擎類型有這些:

    (1)InnoDB是一個支持可靠的事務處理的引擎,可是不支持全文本搜索;

    (2)MyISAM是一個性能極高的引擎,它支持全文本搜索,可是不支持事務處理;

    (3)MEMORY在功能上等同於MyISAM,但因爲數據存儲在內存中,速度很快(特別適合於臨時表);

在建立表的時候能夠使用FOREIGN KEY建立外鍵,即一個表中的指FOREIGN KEY向另外一個表中PRIMARY KEY外鍵FOREIGN KEY用於約束破壞表的聯結動做,保證兩個表的數據完整性。同時也能防止非法數據插入外鍵列,由於該列值必須指向另外一個表的主鍵。

    

     一、FROM:對FROM左邊的表和右邊的表計算笛卡爾積,產生虛表VT1;

     二、ON:對虛擬表VT1進行ON篩選,只有那些符合<join_condition>條件的行纔會被記錄在虛擬表VT2中;

     三、JOIN:若是是OUT JOIN,那麼將保留表中(如左表或者右表)未匹配的行做爲外部行添加到虛擬表VT2中,從而產生虛擬表VT3;

     四、WHERE:對虛擬表VT3進行WHERE條件過濾,只有符合<where_condition>的記錄纔會被放入到虛擬表VT4;

      五、GROUP BY:根據GROUP BY子句中的列,對虛擬表VT4進行分組操做,產生虛擬表VT5;

      六、CUBE|ROLLUP:對虛擬表VT5進行CUBE或者ROLLUP操做,產生虛擬表VT6;

      七、HAVING:對虛擬表VT6進行HAVING條件過濾,只有符合<having_condition>的記錄纔會被插入到虛擬表VT7中

      八、SELECT:執行SELECT操做,選擇指定的列插入到虛擬表VT8中;

      九、DISTINCT:對虛擬表VT8中的記錄進行去重,產生虛擬表VT9;

     十、ORDER BY:將虛擬表VT9中的記錄按照<order_by_list>進行排序操做,產生虛擬表VT10;

     十一、LIMIT:取出指定行的記錄,產生虛擬表VT11,並將結果返回。

     十二、IN類型,表示傳遞給存儲過程;

     1三、OUT類型,表示存儲過程返回的結果,在調用存儲過程時須要傳入@開始的變量;

     1四、INOUT類型,表示在存儲過程當中能夠傳入和傳出;

     1五、DECLARE用來聲明一個變量,如這裏的total,taxrate。注意MySQL中定義變量時都是變量名在前,數據類型在後。

     1六、存儲過程具體邏輯寫在BEGIN END之間;

     1七、將值賦給變量使用INTO關鍵字; 

 

七、刪除表數據

       一、若是從表中刪除數據的話,能夠使用DELETE子句。DELETE FROM customers WHERE cust_id = 10086;刪除的數據一定是表中行數據,而不是某一列。所以,與UPDATE子句相比,DELETE子句並不須要指定是哪一列,而僅僅只須要指定具體的表名便可;

       二、注意:若是不添加WHERE指定條件的話,將整個表中全部行數據所有刪除。另外,DELETE只是刪除表中的數據,而不會刪除表結構信息

      三、若是想刪除表中所有的數據,能夠使用TRUNCATE,比DELETE刪除效率更高。

 

八、建立數據庫   索引 的方法 : 

MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,而組合索引,即一個索引包含多個列。

建立索引

建立索引有兩種方式,一種是直接利用create index進行建立,另一種則是經過修改表結構來進行添加,則是利用ALTER TABLE語句。

[UNIQUE|FULLTEXT|SPATIAL]  其中括號中的這三個關鍵字表示建立的索引類型,它們分別表示惟一索引、全文索引、空間索引三種不一樣的索引類型。若是咱們不指定任何關鍵字,則默認爲普通索引。

注意 : 在MySQL中,有兩種不一樣形式的索引——BTREE索引HASH索引。在存儲引擎爲MyISAMInnoDB的表中只能使用BTREE其默認值就是BTREE;在存儲引擎爲MEMORY或者HEAP的表中能夠使用HASH和BTREE兩種類型的索引,其默認值爲HASH。

 

九、一個版本爲12.1.0.2的Oracle數據庫,每到晚上總會不定時地主機CPU持續到100%,應用同時會建立大量的數據到數據庫中。當時應急方案是把這種相關的等待時間所有批量Kill掉,由於這些系統是在比較核心的庫裏,基本上每一個系統被Kill掉的進程有幾千個。

着手重點分析問題,經過ASH分析發現,出現這個異常等待是由於一個很簡單的語句——SELECT USER FROM SYS.DUAL。

以後就經過這個語句來一步步關聯, 看究竟是哪一個地方調用的,結果發現是在一個應用用戶的登陸TRIGGER中的用戶判斷步驟。這個USER是Oracle的內部函數,但就是這麼簡單的一個語句,就讓整個庫都Hang住了。

經過ASH發現該語句在咱們恢復應用前有從新加載的過程。當時懷疑是硬件致使的,就經過這種方式去分析,結果發現是在晚上10點時被Oracle的自動任務作了一個統計信息的自動收集,收集完後,又由於它是一個登陸的Trigger,用戶在不斷登陸,在作登陸解析時這個語句就沒辦法解析,因此才致使用戶源源不斷地卡在那裏。而應用是須要新建鏈接的,新建的鏈接又沒法進到庫裏面,就會致使鏈接數愈來愈多,全都卡在那裏。最後經過鎖定dual表統

計信息的收集來從根本上解決這個問題。

 

十、一個數據庫是從10.2.0.5.X升級到10.2.0.5.18版本,升級後會不定時出現cursor:pin相關的一些等待。其實出現cursor:pin是很正常的,由於這個數據庫的負載比較高,變化也較高,但問題是它是在升級以後出現的。運營認爲這是升級以後出現的異常,咱們就開始着手分析問題的緣由。

        第二個問題是在應急時發現的,有時異常出現時,某個庫裏有些語句的執行次數會特別高,甚至15min能達到上億次,這對於一個正常的業務系統來講,出現這麼高的執行頻率是不正常的。

       以後就去分析這些問題,發現這兩個問題有相同的一些點,好比語句中間出現了個函數調用;好比說這個狀況下,A表若是訪問的數據量較大時,這些函數就有可能被調用不少次。

      有一個語句,它執行一次可能會出現十幾萬次的函數調用。若是在調用的過程當中,關聯的那張表的執行計劃發生了變化,好比說A表走了一個全程掃描,那可能會出現幾千萬次的函數調用。

       總結了一些關於經過什麼樣的方法去快速定位、是不是函數調用致使的見解。在10g以前確實沒有什麼好的辦法,由於它裏面沒有一個顯示的關聯,就可能經過代碼去掃描,去找對應的語句。在11g後會比較簡單一些,經過AS值相關的TOP LEVEL SQL ID就能夠直接關聯到是哪一個語句調的函數致使的問題。

      這裏還有一個問題是函數調用。由於它調用的函數可能都是特別快的,但次數有會比較高,性能波動可能帶來比較大的影響。以前咱們有一個案例就發生在月底高峯,咱們當時發現某個數據庫中會出現不少CBC的等待,後來又發現有一個小表被頻繁訪問,那個小表就100多行數據,但可能它相關的語句每隔15min就調用了上千萬次。

        其實這麼高的併發下,出現這種CBC的等待是很正常的。不過由於它只有100多行數據,且都集中在一個數據塊裏,因此才致使這個數據塊特別熱,就會一直出現這種CBC的等待。

       方案:建一個PCT FREE 99的索引,把表全部列的數據都包含進去,確保每一個索引塊裏面只保留了一行數據,變相地把這100多行數據分到100多個塊裏。

       作了這個操做後,CBC相關的問題被解決了,也順利地撐過了業務高峯期,但次日月初的報表發現又掉坑裏了。

      對於大表的分表改造就是先同步歷史數據級改造,後作一個數據增量。

 

十一、數據庫CPU使用率頻頻100%又沒有明顯TOPSQL?

此次故障處理的過程反思能夠發現,其實很多的隱患,在平常的巡檢,SQL審覈中均可以被發現,但到了故障現場,可能因爲環境的複雜,被放大後出不少衍生故障,分析定位起來則麻煩很多。平常的巡檢,SQL審覈多花些精力,按期更新本身的知識庫,這些時間最終都是高回報的。

一、100% HIGH CPU風險

100% CPU使用率的風險是大部分系統都存在的,最難受的是發生了HIGH CPU後,可能主機SSH都沒法訪問。這種風險建議在CPU_COUNT層面作調整,該參數默認值是使用所有的CPU資源,考慮對其進行調整爲邏輯CPU-2(單機數據庫)。

 

RAC架構下同一集羣有多個數據庫的結合具體狀況考慮實例CPU隔離,參考support文檔(1362445.1)。

 

resource manager在處理總體使用率上不太好用,業務上AP、TP混合的話,能夠經過RM調整業務的優先級,保障重點業務。報表拖垮了交易系統的問題,能夠經過RM來實施保障。

 

二、LGWR日誌同步性能隱患

高CPU使用率(通常超過80%)或CPU個數過多狀況下,LGWR性能可能受CPU調度影響較大,建議`_high_priority_processes` 設置LGWR。該參數調整須要重啓數據庫,建議規劃後集中調整。

 

十二、沒法將該字符添加到數據庫中:

ERROR 1366: Incorrect string value: '\xF0\x9D\x8C\x86' for column 'text' at row 1

SQL語句:

INSERT INTO `test`.`new_table` (`ID`, `text`) VALUES ('1', '𝌆');

我試着運行這個命令

use test;
ALTER TABLE new_table CHANGE text text VARCHAR(191) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

輸出顯示「0行受影響」。

0 row(s) affected Records: 0  Duplicates: 0  Warnings: 0

我猜utf8mb4不適用於個人行。

但當我運行如下命令時:

ALTER DATABASE test CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

1 row(s) affected

還會發生什麼?

最新狀況:找到了!我失蹤了:

SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

 

1三、刪除安裝的全部的 mysql相關軟件包                  

find / -name "mysql*" -exec rm -rf {} \;

 

1四、yum沒法安裝MySQL數據庫,

解決辦法 : 

一、ping baidu.com查看網絡狀況,沒法上網,先檢測DNS配置

cat /etc/resolv.conf,發現有DNS,

再添加一個DNS地址,8.8.8.8,仍是沒法上網。

/etc/init.d/network restart              #重啓網卡

再查看DNS配置文件,#cat/etc/resolv.conf ,查看IP信息, #ifconfig,查看有沒有設置的DNS

二、仍是沒有ping通,#cat /etc/sysconfig/network-scripts/ifcfg-eth0查看網關有沒有配置。使用route -n再次查看網關設置超過, 

#sestaus    查看防火牆狀態

/etc/init.d/iptables stop

沒有網關,添加一個,0.0.0.0表示外網的任意地址 ,應射到到網關地址192.168.149.2,從dev eth0出去。

 

1五、如何清空MySQL日誌

#cat /dev/null > /var/log/mariadb/mariadb.log

mysql5.5啓動命令

#/usr/local/mysql55/bin/mysql_safe --user=mysql

查看日誌

#tailn -nf 100 /var/log/mariadb/mariadb.log     

#cat /var/log/mariadb/mariadb.log     

常見問題 :

查看有沒有這目錄

ll /var/run/mariadb/

建立目錄

mysql5.5啓動命令

#/usr/local/mysql55/bin/mysql_safe --user=mysql

 

1六、MySQL讀寫分離           

1)爲何保證MySQL主、從數據一致?

2)用戶訪問WEB網站,註冊了用戶名和密碼,xiaowagn,123456;

3)用戶註冊成功以後,WEB將數據信息寫入主庫,此時從庫若是沒有同步主庫用戶和密碼信息;

4)使用xiaowang用戶和密碼登陸,WEB讀取MYSQL讀庫,WEB會返回無此用戶,提示從新註冊;

5)MYSQL主備數據就要嚴格保持一致,避免發生上面的狀況。  

 

1七、MYSQL主從

 

1八、

1九、

20、

 

2一、

2二、

參考鏈接:CPU使用率頻頻100%又沒有明顯TOPSQL?換個思路突破 :https://mp.weixin.qq.com/s/XaSvbsaYy9lGqgr37ysynA

 

連接 :

 MySQL 優化實施方案 :  https://mp.weixin.qq.com/s/-lru6FAhkXTo7gLCCfWlyg

新手MySQL工程師必備命令速查手冊 : https://mp.weixin.qq.com/s/87BoE2-0mW_3qALyNSpiTw

MySQL監控工具 Percona監控工具初探 : https://www.centos.bz/2018/01/percona%E7%9B%91%E6%8E%A7%E5%B7%A5%E5%85%B7%E5%88%9D%E6%8E%A2/

https://www.cnblogs.com/shenqz/p/6962493.html

MariaDB 10.3首推系統版本表,誤刪數據不用跑路了! : https://mp.weixin.qq.com/s/NJip_E3iVFVnp0golFz1Ig

企業面試題|最常問的MySQL面試題集合(一 ):https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486211&idx=1&sn=c8bbf47e3dd892443142ba9b33c37321&chksm=e91b6e1fde6ce7095709efd81614c72fcde19b00524e680a65458b25a181c73b227daa150506&scene=21#wechat_redirect

企業面試題|最常問的MySQL面試題集合(二)  : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486284&idx=1&sn=5f8ed7d5985d7feb202bdcbd3343125c&chksm=e91b6e50de6ce746831e2744188a30d99d6729be7f1344ef4c5b6add4a2b456c1acf8f4a5f58&scene=21#wechat_redirect

 

 

參考連接  : 

mysql數據庫基礎命令(一) : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247484584&idx=1&sn=3bf48189c571bacc1859ef72922ff6eb&chksm=e91b61b4de6ce8a2e2fb2908c8d401e01159780b4786224abbdccb6889f00bd77bfc45ec3f06&scene=21#wechat_redirect

MySQL 8.0優化器都有哪些新特性? : https://mp.weixin.qq.com/s/Hs8QXzXcluSPk9ktWkqbbw

MySQL 基礎操做: https://www.processon.com/special/template/5b2f5f7de4b01a7cb45db105#map

www.runoob.com : http://www.runoob.com/mysql/mysql-database-info.html

面試中有哪些經典的數據庫問題? : https://mp.weixin.qq.com/s/ns9T02-zsO9I3tdG3XJbcw

MySQL到底有多少種日誌類型須要咱們記住的! : https://mp.weixin.qq.com/s/yGytaV7owibajI04Z7rHNw

MySQL中update修改數據與原數據相同會再次執行嗎? : https://mp.weixin.qq.com/s/1KJasUM5UcJ_WL_LzLtfrw

數據庫怎麼分庫分表,垂直?水平? :https://mp.weixin.qq.com/s/MMau4yMwxPTFnVEKpDHYpg

史上更全的MySQL高性能優化實戰總結! :https://mp.weixin.qq.com/s/Uib99Ogmjbs3Vym2vkXw5g

步步深刻MySQL:架構->查詢執行流程->SQL解析順序! :  https://mp.weixin.qq.com/s/8W5KQKuHyJd9BQDwu0uY5Q

企業中MySQL主流高可用架構實戰三部曲之MHA :https://blog.51cto.com/sumongodb/1951495

mysql怎麼建立觸發器 :https://mp.weixin.qq.com/s/LouhSOdCTxSKRhHNuw701Q

怎樣在 Ubuntu Linux 上安裝 MySQL | Linux 中國  : https://mp.weixin.qq.com/s/NqrCwc9qcUbslAWdwqWyuw

MySQL用戶和權限管理 :https://mp.weixin.qq.com/s/rqLLPw8_yHPudT-Kgtjc4A

MySQL數據庫之鏈接查詢 : https://mp.weixin.qq.com/s/oEec6yyabulQ9pDwMA8PQg

推薦一款支持 SQL/NoSQL 數據庫的通用命令行工具 USQL : https://mp.weixin.qq.com/s/NmOqYtxS1taYmvGPstVrKw

MySQL 超級入門教程(內含資源福利) :https://mp.weixin.qq.com/s/2BT5JqCA_WV5OnlRC6-h-A

MySQL精選 | 枚舉類型ENUM的DDL變動測試 :https://mp.weixin.qq.com/s/xpVmB07JgSRE2Nat3lbtoA

MySQL史上最全性能優化方式 : https://mp.weixin.qq.com/s/FqiGwfNWWposdqAC0zFofw

技術核心 | MySQL性能結構優化原理 : https://mp.weixin.qq.com/s/qrK8EdlZMfeReSAKpGnfJA

MySQL DBA基本知識點梳理和查詢優化 :https://mp.weixin.qq.com/s/CdF4iCK72WUOl8c5wny0-Q

MySQL DBA必備工具使用的6大錦囊妙計 :https://blog.51cto.com/sumongodb/1955184

企業主流MySQL高可用集羣架構三部曲之PXC : https://blog.51cto.com/sumongodb/1956086

MySQL主從延遲解決方案 薦 :https://blog.51cto.com/sumongodb/1958723

利用binlog2sql快速閃回誤刪除數據 - 別拿豆包不當乾糧 薦 : https://blog.51cto.com/sumongodb/2046073

MySQL數據庫之鏈接查詢 : https://mp.weixin.qq.com/s/oEec6yyabulQ9pDwMA8PQg

支撐百萬併發的數據庫架構如何設計? : https://mp.weixin.qq.com/s?__biz=MzUyNDkzNzczNQ==&mid=2247485858&idx=1&sn=823bdb7634e90c6775545930142d3582&chksm=fa24f6cacd537fdc01fcf8fc35374f113291a8f583bde4f482439b6764d55ab6c4f2bc71936b&scene=21#wechat_redirect

基於MySQL 5.7多源複製及Keepalived搭建三節點高可用架構 :http://imysql.com/tag/mysql%e9%ab%98%e5%8f%af%e7%94%a8

MySQL 備份和恢復     :      http://imysql.cn/mysql_backup_and_recover

 

 

爲何你的SQL執行很慢  : https://www.jianshu.com/p/96c5afdb84c6

找到MySQL服務器發生SWAP罪魁禍首   :  http://imysql.com/2016/11/30/mysql-faq-find-who-cause-mysql-swap.shtml

一次很是有意思的SQL優化經歷:從30248.271s到0.001s :https://www.jianshu.com/p/9fab9266be84

巧用這19條MySQL優化,效率至少提升3倍 :https://mp.weixin.qq.com/s?__biz=MzUyNDkzNzczNQ==&mid=2247485791&idx=1&sn=b9f4097226c9d4ea13e0f1855bbe8b7b&chksm=fa24f637cd537f211ddec965f3b0ed3e3ebc0b03623dfec3f0b917298ea332d6c4968c407902&scene=21#wechat_redirect

MySQL優化 : http://imysql.com/tag/mysql%e4%bc%98%e5%8c%96

[MySQL優化案例]系列 — RAND()優化  :http://imysql.com/2014/07/04/mysql-optimization-case-rand-optimize.shtml

[MySQL FAQ]系列 — 線上環境到底要不要開啓query cache : http://imysql.com/2014/09/05/mysql-faq-why-close-query-cache.shtml

[MySQL FAQ]系列 — 爲何InnoDB表要建議用自增列作主鍵 : http://imysql.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml

優化案例 | 分區表場景下的SQL優化 : http://imysql.com/2017/04/11/mysql-optimize-with-many-partitions.shtml

優化系列 | DELETE子查詢改寫優化  : http://imysql.com/2016/06/29/mysql-optimization-rewrite-delete-subquery-to-join.shtml

重裝上陣 | 最方即可靠的MySQL my.cnf生成工具  :http://imysql.com/2017/03/06/new-my-cnf-generator-reload.shtml

比較全面的MySQL優化參考(下篇) : http://imysql.com/2015/05/29/mysql-optimization-reference-2.shtml

tcpcopy,模擬在線MySQL壓力測試的好幫手

MySQL 備份和恢復思路:http://imysql.cn/mysql_backup_and_recover

[MySQL FAQ]系列 — 爲何要關閉query cache,如何關閉 :http://imysql.com/2015/03/27/mysql-faq-why-should-we-disable-query-cache.shtml

[MySQL優化案例]系列 — slave延遲很大優化方法 :http://imysql.com/2015/04/12/mysql-optimization-case-howto-resolve-slave-delay.shtml

 

優化系列 | 實例解析MySQL性能瓶頸排查定位  : http://imysql.com/tag/%e4%bc%98%e5%8c%96

遷移Zabbix數據庫到TokuDB :http://imysql.com/tag/zabbix

發現一個關於MySQL的metadata lock的BUG : 

https://mp.weixin.qq.com/s/Ia6DaXd4DHrXZ2ZMCzt0_A

MySQL 到 GBase 8t 遷移指南 | 週末送資料 : https://mp.weixin.qq.com/s/CM9dw_R87ditZ2P-IJ2xWg

SQL語句練習-電腦商店 :  https://blog.ansheng.me/article/computer-store-sql-exercises/

SQL語句練習 : https://blog.ansheng.me/article/sql-exercises/

相關文章
相關標籤/搜索