Mysql 知識點

數據類型
<1>整數型
     類型      大小      範圍(有符號)               範圍(無符號unsigned)    用途
     TINYINT   1 字節    (-128127)                (0255)                 小整數值
     SMALLINT  2 字節    (-3276832767)            (065535)               大整數值
     MEDIUMINT 3 字節    (-83886088388607)        (016777215)            大整數值
     INT       4 字節    (-21474836482147483647)  (04294967295)          大整數值
     BIGINT    8 字節     ()                       (0264次方減1)        極大整數值
​
<2>浮點型
 FLOAT(m,d)  4 字節    單精度浮點型  備註:m代表總個數,d代表小數位個數
 DOUBLE(m,d) 8 字節    雙精度浮點型  備註:m代表總個數,d代表小數位個數
 
 <3>定點型
 DECIMAL(m,d)    依賴於M和D的值    備註:m代表總個數,d代表小數位個數
 
 <4>字符串類型 
 類型          大小              用途
 CHAR          0-255字節         定長字符串
 VARCHAR       0-65535字節       變長字符串
 TINYTEXT      0-255字節         短文本字符串
 TEXT          0-65535字節       長文本數據
 MEDIUMTEXT    0-16777215字節    中等長度文本數據
 LONGTEXT      0-4294967295字節  極大文本數據
 
 char的優缺點:存取速度比varchar更快,但是比varchar更佔用空間
 varchar的優缺點:比char省空間。但是存取速度沒有char<5>時間型
 數據類型    字節數            格式                    備註
 date        3                yyyy-MM-dd              存儲日期值
 time        3                HH:mm:ss                存儲時分秒
 year        1                yyyy                    存儲年
 datetime    8                yyyy-MM-dd HH:mm:ss     存儲日期+時間
 timestamp   4                yyyy-MM-dd HH:mm:ss     存儲日期+時間,可作時間戳
基礎mysql語句
  1. DML語句
    建庫
    	查看當前mysql使用的字符集
    	show variables like 'character%';
    	直接創建數據庫 db1
    	create database db1;  
    	查看當前在哪個庫裏邊
    	select database();
    	進入庫的操作
    	use 庫名; 
    	判斷是否存在,如果不存在則創建數據庫 db2
    	create database if not exists db2;    
    	創建數據庫並指定字符集爲 gbk
    	create database db3 default character set gbk;    
    	查看某個庫是什麼字符集;
    	show create database XD; 
    
    建表
    CREATE TABLE 表名 (
                  字段名1 字段類型1 約束條件1 說明1,
                  字段名2 字段類型2 約束條件2 說明2,
                  字段名3 字段類型3 約束條件3 說明3
                  );
    create table 新表名 as select * from 舊錶名 where 1=2;(注意:建議這種創建表的方式用於日常測試,因  爲可能索引什麼的會複製不過來)
    create table 新表名 like 舊錶名;
    
    約束條件:
    comment         ----說明解釋
    not null        ----不爲空
    default         ----默認值
    unsigned        ----無符號(即正數)
    auto_increment  ----自增
    zerofill        ----自動填充
    unique key      ----唯一值
    
    查看數據庫中的所有表:show tables;
    查看錶結構:desc 表名;
    查看創建表的sql語句:show create table 表名;
    \G :有結束sql語句的作用,還有把顯示的數據縱向旋轉90度
    \g :有結束sql語句的作用
    
    修改表
    修改表名
    	rename table 舊錶名 to 新表名;
    	rename table student to user;
    
    添加列
    	給表添加一列:alter table 表名 add 列名 類型;
    	alter table user add addr varchar(50);
    	alter table add 列名 類型 comment '說明';
    	alter table user add famliy varchar(50) comment '學生父母';
    ​
    	給表最前面添加一列:alter table 表名 add 列名 類型 first;
    	alter table user add job varchar(10) first;
    ​
    	給表某個字段後添加一列:alter table 表名 add 列名 類型 after 字段名;
    	alter table user add servnumber int(11)  after id;
    ​
    	注意:沒有給表某個字段前添加一列的說法。
    修改列類型
    	alter table 表名 modify 列名 新類型;
    	alter table user modify servnumber varchar(20);
    修改列名
    	alter table 表名 change 舊列名 新列名 類型;
    	alter table user change servnumber telephone varchar(20);
    刪除列
    	alter table 表名 drop 列名;
    	alter table user drop famliy;
    修改字符集
    	alter table 表名 character set 字符集;
    	alter table user character  set GBK;
    mysql表的刪除
    	drop table 表名;
    	drop table user;
    	看錶是否存在,若存在則刪除表:drop table if exists 表名;
    	drop table  if exists teacher;
    
  2. DDL各種語法
    DDL插入
    普通的插入表數據
    	insert into 表名(字段名) values(字段對應值);
    	insert into employee (empno,ename,job,mgr,hiredate,sal,deptnu) values ('1000','小明','經理','10001','2019-03-03','12345.23','10');
    	insert into 表名 values(所有字段對應值);
    	insert into employee  values ('1001','小明','經理','10001','2019-03-03','12345.23','10');    
    蠕蟲複製(將一張表的數據複製到另一張表中)
    	insert into 表名1 select * from 表名2;
    	insert into 表名1(字段名1,字段名2select 字段名1,字段名2 from 表名2;
    	insert into emp (empno,ename) select empno,ename from employee;
    建表複製
    	create table 表名1 as select 字段名1,字段名2 from 表名2;
    	create table emp as select empno ,ename from employee;
    一次性插入多個數據
     	insert into 表名  (字段名) values (對應值1),(對應值2),(對應值3);   
    
    DDL修改刪除
    修改(更新):
    update 表名 set 字段名1=1 where 字段名=;
    update 表名 set 字段名1=1,字段名2=2 where 字段名=;
    
    刪除:
    delete from 表名 where 字段名=;
    
    delele 會把刪除的操作記錄給記錄起來,以便數據回退,不會釋放空間,而且不會刪除定義。
    truncate不會記錄刪除操作,會把表佔用的空間恢復到最初,不會刪除定義
    drop會刪除整張表,釋放表佔用的空間。
    
    where條件查詢
    簡單查詢
    select * from employee;
    select empno,ename,job as ename_job from employee;
    
    精確條件查詢
    select * from employee where ename='後裔';
    select * from employee where sal != 50000;
    select * from employee where sal <> 50000;
    select * from employee where sal > 10000;
    
    模糊條件查詢
    show variables like '%aracter%'; 
    select * from employee  where ename like '林%';
    
    範圍查詢
    select * from employee where sal between 10000 and 30000;
    select * from employee where hiredate between '2011-01-01' and '2017-12-1';
    
    離散查詢
    select * from employee where ename in ('猴子','林俊杰','小紅','小胡'); 
     
    清除重複值
    select distinct(job) from employee;
    
    統計查詢(聚合函數):
       count(code)或者count(*)
        select count(*) from employee;
        select count(ename) from employee;
        
       sum()  計算總和 
        select sum(sal) from employee;
        
       max()  計算最大值
        select * from employee where sal= (select  max(sal) from employee);
        
       avg()  計算平均值
        select avg(sal) from employee;
        
       min()  計算最低值
        select * from employee where sal= (select  min(sal) from employee);
        
       concat函數: 起到連接作用
        select concat(ename,' 是 ',job) as aaaa from employee;
    
    group by分組查詢
    select deptnu,count(*) from employee group by deptnu;
    select deptnu,job,count(*) from employee group by deptnu,job;
    select job,count(*) from employee group by job;
    
    having條件查詢
    select job,count(*) from employee group by job having job ='文員';
    select  deptnu,job,count(*) from employee group by deptnu,job having count(*)>=2;
    select  deptnu,job,count(*) as 總數 from employee group by deptnu,job having 總數>=2;
    
    order by排序查詢(排序)
    select * from employee order by sal;
    select * from employee order by hiredate;
    select  deptnu,job,count(*) as 總數 from employee group by deptnu,job having 總數>=2 order by deptnu desc;
    select  deptnu,job,count(*) as 總數 from employee group by deptnu,job having 總數>=2 order by deptnu asc;
    select  deptnu,job,count(*) as 總數 from employee group by deptnu,job having 總數>=2 order by deptnu;
    ​
    順序:where ---- group by ----- having ------ order by 
    
    limit限制查詢(限制)
    select * from XD.employee limit n,m n:代表起始條數值,不寫默認爲0;m代表:取出的條數
    
    exists型子查詢(返回一個boolean值)
    分爲倆種:existsnot exists
    
    select 1 from employee where 1=1;
    select * from 表名 a where exists (select 1 from 表名2 where 條件);
    ​
    eg:查詢出公司有員工的部門的詳細信息
    select * from dept a where exists (select 1 from employee b where a.deptnu=b.deptnu);
    select * from dept a where not exists (select 1 from employee b where a.deptnu=b.deptnu);
    
    左連接查詢與右連接查詢
    select a.dname,b.* from dept a  left join employee b on a.deptnu=b.deptnu;
    select b.dname,a.* from employee a  right join  dept b on b.deptnu=a.deptnu;
    
    內連接查詢與聯合查詢
    eg:想查出員工張飛的所在部門的地址
    select a.addr  from dept a inner join employee b on a.deptnu=b.deptnu and b.ename='張飛';
    select a.addr from dept a,employee b where a.deptnu=b.deptnu and b.ename='張飛';
    
    union查詢的注意事項:
    (1)兩個select語句的查詢結果的“字段數”必須一致;
    ​
    (2)通常,也應該讓兩個查詢語句的字段類型具有一致性;
    ​
    (3)也可以聯合更多的查詢結果;
    ​
    (4)用到order by排序時,需要加上limit(加上最大條數就行),需要對子句用括號括起來
    ​
    eg:對銷售員的工資從低到高排序,而文員的工資從高到低排序
        (select * from employee a where a.job = '銷售員'  order by a.sal limit 999999 ) union  (select * from employee b where b.job = '文員' order by b.sal desc limit 999999);
    
mysql用戶權限和密碼
  1. 查看root權限
    查看root用戶可以在哪臺機器登錄
    select user,host from mysql.user where user='root';
    修改mysql庫裏邊的userupdate mysql.user set host='localhost' where user='root';
    刷新權限
    flush privileges;
    
  2. 修改用戶密碼分三種方法:
    第一種:set password for 用戶@ip = password('密碼');
    	set password for root@localhost = password('root');
    	
    第二種:mysqladmin -u用戶 -p舊密碼 password 新密碼;
    	mysqladmin -urootmysqladmin -uroot -proot password;
    	
    第三種:update mysql.user set authentication_string=password('密碼') where user='用戶' and host='ip';
    	update mysql.user set authentication_string=password('root') where user='root' and host='localhost';
    
  3. 忘記密碼 :在mysql問題中有講解
用戶權限控制
  1. 創建用戶
    創建用戶的語法:create user 'username'@'host' identified by 'password';
    
    	username:你將創建的用戶名
    	​
    	host:指定該用戶在哪個主機上可以登陸,如果是本地用戶可用localhost,如果想讓該用戶可以從任意遠程主機    登陸,可以使用通配符%
    	​
    	password:該用戶的登陸密碼,密碼可以爲空,如果爲空則該用戶可以不需要密碼登陸服務器
    	
    創建用戶語法:
    
    創建一個pig用戶,並指定登錄密碼:123456,可以在任何一臺遠程主機都可以登錄
    create user 'pig'@'%' identified by '123456';
    
    創建一個pig用戶,並指定登錄密碼:爲空,指定在120網段的機器登錄
    create user 'pig'@'120.%.%.%' identified by '';
    
  2. 查看權限:
       	select * from mysql.user where user='pig'\G
       	
        mysql> show grants for 'pig'@'%';
        +---------------------------------+
        | Grants for pig@%                |
        +---------------------------------+
        | GRANT USAGE ON *.* TO 'pig'@'%' |
        +---------------------------------+
        USAGE:無權限的意思
        mysql> show grants for 'root'@'localhost';
        +---------------------------------------------------------------------+
        | Grants for root@localhost                                           |
        +---------------------------------------------------------------------+
        | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
        +---------------------------------------------------------------------+
        WITH GRANT OPTION:表示這個用戶擁有grant權限,即可以對其他用戶授權
    
  3. 刪除用戶語法:drop user ‘username’@‘host’;
    drop user 'pig'@'%';
    delete from mysql.user where user='pig';
    
  4. 授權語法:
    grant 權限1,權限2..... on 數據庫對象 to '用戶'
    grant 權限1,權限2..... on 數據庫對象 to '用戶'@'host' identified by 'password';
    
    all privileges:代表所有權限
    . :代表所有庫所有表
    
    	對現有用戶進行授權:對現有用戶pig授予所有庫所有表所有權限。
    	grant all privileges on *.*  to 'pig';
    	
    	對沒有的用戶進行授權:創建一個新用戶dog授予XD庫的所有權限,登錄密碼123456,任何一臺主機登錄
    	grant all privileges on XD.* to 'dog'@'%' identified by '123456';
    	
    	對沒有的用戶進行授權:創建一個新用戶cat授予XD庫的employee表 查與修改權限,登錄密碼123456,任何一臺主機登錄
    	grant select,update on XD.employee to 'cat'@'%' identified by '123456'
    	
    	對沒有的用戶進行授權:對用戶cat授予XD庫的employee表insert 權限,登錄密碼123456,任何一臺主機登錄
    	grant insert on XD.employee to 'cat'@'%' identified by '123456';
    	
    回收語法:revoke 權限1,權限2..... on 數據庫對象 from '用戶'@'host';
    	回收pig用戶的所有權限(注意:並沒有回收它的登錄權限)
    	revoke all privileges on *.*  from 'pig' @ '%';
    	flush privileges;
    回收pig用戶的所有權限(並回收它的登錄權限)
    	delete from mysql.user where user='pig';
    	flush privileges;
    回收cat用戶對XD庫的employee的查與修改權限
    	revoke select,update on XD.employee from 'cat'@'%';
    	flush privileges;
    
    視圖
    創建的基本語法是:
    create view <視圖名稱> as select 語句;
    create view <視圖名稱> (字段) as select 語句;
    create or replace view <視圖名稱>;
    修改的語法是:
    alter view <視圖名稱> as select 語句;
    視圖刪除語法:
    drop view <視圖名稱> ;
    
    觸發器
    create trigger 觸發器名稱  after/before   insert/update/delete on 表名  
        for each row
        begin
        sql語句;
        end
            
    after/before:可以設置爲事件發生前或後
    insert/update/delete:它們可以在執行insertupdatedelete的過程中觸發
    for each row:每隔一行執行一次動作
    
    刪除觸發器的語法:
    drop trigger 觸發器名稱;
    
    創建存儲過程語法:
    create procedure 名稱 (參數....)
            begin
             	過程體;
            	過程體;
             end
    參數:in|out|inout 參數名稱 類型(長度)
            in:表示調用者向過程傳入值(傳入值可以是字面量或變量)
            out:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)
            inout:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量)
    聲明變量:declare 變量名 類型(長度) default 默認值;
    給變量賦值:set @變量名=;
    調用存儲命令:call 名稱(@變量名);
    刪除存儲過程命令:drop procedure 名稱;
    查看創建的存儲過程命令:
    show create procedure 名稱\G;
    
事務實戰
  1. 事務特性
    • 原子性(Atomicity):事務必須是原子工作單元,一個事務中的所有語句,應該做到:要麼全做,要麼一個都不做;
    • 一致性(Consistency):讓數據保持邏輯上的“合理性”,比如:小明給小紅打10000塊錢,既要讓小明的賬戶減少10000,又要讓小紅的賬戶上增加10000塊錢;
    • 隔離性(Isolation):如果多個事務同時併發執行,但每個事務就像各自獨立執行一樣。
    • 持久性(Durability):一個事務執行成功,則對數據來說應該是一個明確的硬盤數據更改(而不僅僅是內存中的變化)。
      你要使用事務的話,表的引擎要爲innodb引擎
  2. 事務操作
    事務的開啓:begin; start transaction;
    
    事務的提交:commit;
    
    事務的回滾:rollback;
    
    開啓autocommit(臨時生效):set autocommit=1;
    開啓autocommit(永久生效):
    	修改配置文件:vi /etc/my.cnf 在[mysqld]下面加上:autocommit=1 記得重啓服務纔會生效
    
索引
  1. mysql存儲介紹
    MyISAM與InnoDB的區別:
    MyISAM:支持全文索引(full text;不支持事務;表級鎖;保存表的具體行數;奔潰恢復不好
    
    Innodb:支持事務;以前的版本是不支持全文索引,但在5.6之後的版本就開始支持這個功能了;行級鎖(並非絕對,當執行sql語句時不能確定範圍時,也會進行鎖全表例如: update table set id=3 where name like 'a%';;不保存表的具體行數;奔潰恢復好
    
    MyISAM:
    •    一般來說MyISAM不需要用到事務的時候
    •    做很多count計算
    ​
    InnoDB(推薦):
    •    可靠性要求高的,或者要求支持事務
    •    想要用到外鍵約束的時候(講外鍵的時候會講)
    
  2. 索引:索引是一個單獨的,存儲在磁盤中上的數據庫結構,它們包含着對數據表裏的所有記錄的引用指針。使用索引可以快速的找出在某列或多列中有特定值的行。
  3. 索引的優缺點
    索引的優點:
    通過創建唯一索引,來保證數據庫表中的每一行數據的唯一性。
    • 可以加快數據的檢索速度。
    • 可以保證表數據的完整性與準確性
    索引的缺點:
    索引需要佔用物理空間。
    • 對錶中的數據進行改動時,索引也需要跟着動態維護,降低了數據的維護速度。
  4. 常見索引:
    • index:普通索引:普通索引(index)顧名思義就是各類索引中最爲普通的索引,主要任務就是提高查詢速度。其特點是允許出現相同的索引內容,允許空(null)值
    • unique:唯一索引:(unique)顧名思義就是不可以出現相同的索引內容,但是可以爲空(null)值
    • primary key:主鍵索引:把主鍵添加索引就是主鍵索引,它是一種特殊的唯一索引,不允許有空值,而唯一索引(unique是允許爲空值的)。指定爲“PRIMARY KEY”
    • foreign key:外鍵索引
    • fulltext: 全文索引是將存儲在數據庫中的文章或者句子等任意內容信息查找出來的索引,單位是詞。全文索引也是目前搜索引擎使用的一種關鍵技術。指定爲 fulltex
    • 組合索引
    主鍵索引
    	刪除主鍵:
    	語法:
    	alter table 表名 drop primary key;
    	eg: 
    	alter table test drop primary key;
    	注意:在有自增的情況下,必須先刪除自增,纔可以刪除主鍵
    	刪除自增:alter table test change id id int(7) unsigned zerofill not null;
    全文索引
    	select * from 表名 where match  (字段名) against ('檢索內容');
    	查看匹配度:
    	select * from command where match(instruction) against ('directory');
    	停止詞:出現頻率很高的詞,將會使全文索引失效
    	in boolean mode 模式:
    		in boolean mode:意思是指定全文檢索模式爲布爾全文檢索(簡單可以理解爲是檢索方式)
    		select * from 表名 where match (字段名) against ('檢索內容' in boolean mode);
    	注意點:使用通配符*時,只能放在詞的後邊,不能放前邊。
    	刪除全文索引:
    	alter table command drop index instruction;
    	注意點總結:
    	    1、一般情況下創建全文索引的字段數據類型爲 charvarchartext 。其它字段類型不可以
    		2、全文索引不針對非常頻繁的詞做索引。比如isnonot,you,me,yes這些,我們稱之爲停止詞
    	    3、對英文檢索時忽略大小寫
    什麼是外鍵?
    	外鍵就是作用於兩個表數據之間的鏈接的一列或多列,用來保證表與表之間的數據的完整性和準確性。
    添加外鍵約束:
    	語法:foreign key (字段名) references 關聯的表名(關聯表的字段名)
    注意:主鍵跟外鍵的字段類型一定要相
    create table的方法:
    	CREATE TABLE `employee` (
    	  `empno` int(11) NOT NULL COMMENT '僱員編號',
    	  `ename` varchar(50) DEFAULT NULL COMMENT '僱員姓名',
    	  `job` varchar(30) DEFAULT NULL,
    	  `mgr` int(11) DEFAULT NULL COMMENT '僱員上級編號',
    	  `hiredate` date DEFAULT NULL COMMENT '僱傭日期',
    	  `sal` decimal(7,2) DEFAULT NULL COMMENT '薪資',
    	  `deptnu` int(11) DEFAULT NULL COMMENT '部門編號',
    	  PRIMARY KEY (`empno`),
    	 foreign key (deptnu) references dept(deptnu)
    	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    alter table的方法:
    	alter table employee add foreign key (deptnu) references dept(deptnu);
    刪除外鍵約束:
    	注意:在幹掉外鍵索引之前必須先把外鍵約束刪除,才能刪除索引
    	mysql> alter table employee drop index deptnu;
    	ERROR 1553 (HY000): Cannot drop index 'deptnu': needed in a foreign key constraint
    	mysql> 
    	mysql> alter table employee drop foreign key employee_ibfk_1;
    	Query OK, 0 rows affected (0.01 sec)
    	Records: 0  Duplicates: 0  Warnings: 0
    	mysql> 
    	mysql> alter table employee drop index deptnu;
    	Query OK, 0 rows affected (0.01 sec)
    	Records: 0  Duplicates: 0  Warnings: 0
    注意點總結:
    	(1)倆個表,主鍵跟外鍵的字段類型一定要相同
    	(2)要使用外鍵約束表的引擎一定得是InnoDB引擎,MyISAM是不起作用的
    	(3)在幹掉外鍵索引之前必須先把外鍵約束刪除,才能刪除索引
    詳細介紹聯合索引
    	什麼是聯合索引?
    		聯合索引又稱組合索引或者複合索引,是建立在倆列或者多列以上的索引。
    	怎麼來創建聯合索引?
    		alter table 表名 add index(字段1,字段2,字段3);
    		alter table test add index(username,servnumber,password);
    	怎麼刪除聯合索引?
    		alter table test drop index username;
    	爲什麼要使用聯合索引,而不使用多個單列索引?
    		聯合索引的效率遠遠高於單列索引
    	聯合索引的最左原則
    注意點總結:
    	 索引並非越多越好,過多的索引會增加數據的維護速度還有磁盤空間的浪費。
    		• 當表的數據量很大的時候,可以考慮建立索引。
    		• 表中經常查數據的字段,可以考慮建立索引			​
    		• 想要保證表中數據的唯一性,可以考慮建立唯一索引。
    		• 想要保證倆張表中的數據的完整性跟準確性,可以考慮建立外鍵約束			​
    		• 經常對多列數據進行查詢時,可以考慮建立聯合索引。
    
  5. 慢查詢
    第一步:查看是否已經開啓了慢查詢日誌
    mysql> show variables like 'slow%';
    +---------------------+--------------------------------------+
    | Variable_name       | Value                                |
    +---------------------+--------------------------------------+
    | slow_launch_time    | 2                                    |
    | slow_query_log      | OFF                                  |
    | slow_query_log_file | /data/mydata/xdclass-public-slow.log |
    +---------------------+--------------------------------------+
    第二步:開啓慢查詢日誌
    set global slow_query_log = on ;
    
    日誌路徑也可以自定義:
    
    set global slow_query_log_file = '路徑';
    第三步:查看慢查詢的時間臨界值
    show variables like '%long%';
    第四步:設置慢查詢的時間標準
    set long_query_time=0.4;
    注意:重啓mysql服務會讓在交互界面設置的慢查詢恢復到默認
    永久生效的設置方法:修改配置文件 vi /etc/my.cnf
    [mysqld]
    slow_query_log = 1
    long_query_time = 0.1
    slow_query_log_file =/usr/local/mysql/mysql_slow.log
    
    最後必須重啓服務才能生效!
    
  6. 性能查詢
    第一步:查看性能詳情是否開啓
    mysql> show variables like '%profiling%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | have_profiling         | YES   |
    | profiling              | OFF   |
    | profiling_history_size | 15    |
    +------------------------+-------+
    第二步:開啓性能記錄功能
    set profiling = on ;
    第三步:查看性能的記錄
    mysql> show profiles;
    +----------+------------+---------------------------------------------------+
    | Query_ID | Duration   | Query                                             |
    +----------+------------+---------------------------------------------------+
    |        1 | 0.00177775 | show variables like '%profiling%'                 |
    |        2 | 0.00037900 | select * from test where id='087878'              |
    |        3 | 0.34618025 | select * from test where servnumber='1367008787'  |
    |        4 | 0.31986825 | select * from test where servnumber='13670087879' |
    +----------+------------+---------------------------------------------------+
    第四步:查看語句的執行性能詳情
    mysql> show profile for query 4;
    +----------------------+----------+
    | Status               | Duration |
    +----------------------+----------+
    | starting             | 0.000100 |
    | checking permissions | 0.000010 |
    | Opening tables       | 0.000023 |
    | init                 | 0.000045 |
    | System lock          | 0.000015 |
    | optimizing           | 0.000016 |
    | statistics           | 0.000028 |
    | preparing            | 0.000020 |
    | executing            | 0.000006 |
    | Sending data         | 0.319489 |
    | end                  | 0.000037 |
    | query end            | 0.000012 |
    | closing tables       | 0.000012 |
    | freeing items        | 0.000040 |
    | cleaning up          | 0.000017 |
    +----------------------+----------+
    性能線程的詳細解釋官方文檔鏈接:
    https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html
    
sql優化
  1. explain用於查詢sql語句的操作過程
  2. 爲經常查詢的字段建立索引
  3. 爲經常分組,排序,union,distinct建立索引
  4. 數據少的字段不建立索引
  5. 儘量不用default null 而是 not null default ‘’
  6. 多用distinct少用group by
  7. 多用between少用in
  8. 避免類型轉換
  9. 避免查詢所有字段
  10. 避免使用or
  11. %放在前面不會進行索引使用
中文亂碼問題
  1. 可以用語句查看各部分編碼
    show variables like 'character%';
    
    結果
    mysql> show variables like 'character%';
    +--------------------------+----------------------------------+
    | Variable_name            | Value                            |
    +--------------------------+----------------------------------+
    | character_set_client     | utf8                             |
    | character_set_connection | utf8                             |
    | character_set_database   | utf8                             |
    | character_set_filesystem | binary                           |
    | character_set_results    | utf8                             |
    | character_set_server     | utf8                             |
    | character_set_system     | utf8                             |
    | character_sets_dir       | /usr/local/mysql/share/charsets/ |
    +--------------------------+----------------------------------+
    
    character_set_client:客戶端請求數據的字符集
    character_set_connection:客戶端與服務器連接的字符集
    character_set_database:數據庫服務器中某個庫使用的字符集設定,如果建庫時沒有指明,將默認使用配置上的字符集
    character_set_results:返回給客戶端的字符集(從數據庫讀取到的數據是什麼編碼的)
    character_set_server:爲服務器安裝時指定的默認字符集設定。
    character_set_system:系統字符集(修改不了的,就是utf8)
    character_sets_dir:mysql字符集文件的保存路徑
    
    修改編碼
    臨時:set names gbk;
    永久:修改配置文件my.cnf裏邊的
    	[client]
    	default-character-set=gbk
    	作用於外部的顯示
    	[mysqld]
    	character_set_server=gbk
    	作用於內部,會作用於創建庫表時默認字符集
    	
    修改庫的字符集編碼
    alter database xiaoxiao default character set gbk;
    
    修改表的字符集編碼
    alter table employee default character set utf8;
    
數據備份
  1. 數據庫的備份類型:

    1)完全備份:對整個數據庫的數據進行備份
    
    (2)部分備份:對部分數據進行備份(可以是一張表也可以是多張表)
    
    	  增量備份:是以上一次備份爲基礎來備份變更數據的,節約空間
    
    	  差異備份:是以第一次完全備份的基礎來備份變更備份的,浪費空間
    
  2. 數據庫備份的方式:

    1)邏輯備份:直接生成sql語句保存起來,在恢復數據的時候執行備份的sql語句來實現數據的恢復
    
    (2)物理備份:直接拷貝相關的物理數據
    

    區別:邏輯備份效率低,恢復數據效率低,但是邏輯備份節約空間;物理備份浪費空間,但是相對邏輯備份而言效率比較高

  3. 數據庫備份的場景:

    1)熱備份:備份時,數據庫的讀寫操作不會受到影響
    
    (2)溫備份:備份時,數據庫的讀操作可以進行,但是寫操作不能執行
    
    (3)冷備份:備份時,不能進行任何操作
    
  4. 如何利用mysql自帶命令mysqldump來備份單庫或者多庫

    mysqldump使用語法:
    
    mysqldump -u 用戶 -h host -p 密碼 dbname table > 路徑
    
    遠程備份單庫例子:
    
    mysqldump -uroot -pabc123456 -h120.25.93.69 zabbix | gzip  > /mysql_data_back/zabbix_users.sql.gz
    遠程備份單庫例子並保留創建庫語句:
    
    mysqldump -uroot -pabc123456 -h120.25.93.69 --databases zabbix | gzip  > /mysql_data_back/zabbix_bak.sql.gz
    遠程備份單庫單表的例子:
    
    mysqldump -uroot -pabc123456 -h120.25.93.69 zabbix  users | gzip  > /mysql_data_back/zabbix_users.sql.gz
    遠程備份多庫的例子:
    
    mysqldump -uroot -pabc123456 -h120.25.93.69 --databases zabbix XD | gzip  > /mysql_data_back/zabbix_XD.sql.gz
    遠程備份全庫的例子:
    
    mysqldump -uroot -pabc123456 -h120.25.93.69 --all-databases  | gzip  > /mysql_data_back/all.sql.gz
  5. mysql數據安全之mysql數據的恢復

    	簡介:如何恢復數據
    	
    	遠程恢復數據(備份的數據文件裏有創建庫的語句):
    	
    	mysql -uroot -pabc123456 -h120.25.93.69  < zabbix_bak.sql
    	​
    	遠程恢復數據(備份的數據文件裏沒有創建庫的語句):
    	
    	mysql -uroot -pabc123456 -h120.25.93.69  zabbix < zabbix_bak.sql
    
  6. mysql數據安全之物理備份

    看找數據庫源文件路徑(一):
    
    mysql> show variables like 'datadir%';
    +---------------+---------------+
    | Variable_name | Value         |
    +---------------+---------------+
    | datadir       | /data/mydata/ |
    +---------------+---------------+
    ​
    看找數據庫源文件路徑(二):
    
     cat /etc/my.cnf
    ​
    MyISAM表源文件:
    
    db.opt:創建庫的時候生成,主要存儲着當前庫的默認字符集和字符校驗規則
    ​
    .frm :記錄着表結構信息的文件
    ​
    .MYI:記錄着索引的文件
    ​
    .MYD :記錄着表的數據
    ​
    InnoDB表源文件:InnoDB有着共享表空間跟獨立表空間的概念。
    
    db.opt:創建庫的時候生成,主要存儲着當前庫的默認字符集和字符校驗規則
    
    .frm :記錄着表結構信息的文件
    
    .ibd :獨立表空間,裏邊記錄這個表的數據和索引
    
    ibdata1:共享表空間,裏邊記錄表的數據和索引
    
    請求全局讀鎖:
    
    flush tables with read lock;
    
    解鎖:
    
    unlock tables;
    
  7. mysql數據安全之利用二進制日誌mysqlbinlog備份數據

    簡介:講解如何利用二進制日誌來備份數據
    
    什麼是二進制日誌:
    
    二進制日誌就是記錄着mysql數據庫中的一些寫入性操作,比如一些增刪改,但是,不包括查詢!
    
    二進制日誌有哪些功能:
    
    一般情況下,二進制日誌有着數據複製和數據恢復的功能
    
    注意:
    
    開啓二進制日誌會有1%的性能消耗!
    
    查看二進制日誌是否開啓:
    
    mysql> show variables like 'log_bin%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin                         | OFF   |
    ​
     
    
    開啓二進制日誌 : vi /etc/my.cnf
    
    [mysqld]
    log-bin=/data/mydata/log_bin/mysql-bin
    server-id=1
    ​
    查看所有的binlog日誌列表:
    
    mysql> show master logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |     23638 |
    +------------------+-----------+
    ​
    刷新二進制日誌:
    
    flush logs;
    ​
    重置(清空)二進制日誌文件:
    
    mysql> show master logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |      1091 |
    +------------------+-----------+
    ​
    使用mysqldump備份數據時,加上-F選項可以重新生成一個新的二進制日誌文件
    
    mysqldump -uroot -p XD user -F  > user_bak.sql
    
  8. mysql數據安全之利用二進制日誌mysqlbinlog恢復數據

    簡介:講解如何利用二進制日誌來恢復數據
    
    查看二進制日誌文件的內容報錯:
    
    [root@xdclass-public log_bin]# mysqlbinlog mysql-bin.000002
    mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8'
    ​
    解決:
    
    第一種:在mysqlbinlog 後邊加上 --no-defaults 
    ​
    第二種:註釋掉配置文件裏邊的default-character-set=utf8
    ​
    把二進制日誌文件導出成普通文件:
    
     mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000002 > mysqlbin.sql
    ​
    找出要恢復的位置:
    
    (1)找出關鍵字的行數:mysqlbinlog --no-defaults mysql-bin.000002 | cat -n  | grep -iw 'drop'[root@xdclass-public log_bin]# mysqlbinlog --no-defaults mysql-bin.000002 | cat -n  | grep -iw 'drop'
      4180  DROP TABLE `user` /* generated by server */
    ​
    ​
    (2)打印出相關內容:mysqlbinlog --no-defaults mysql-bin.000002 | cat -n | sed -n '4170,4180p'[root@xdclass-public log_bin]# mysqlbinlog --no-defaults mysql-bin.000002 | cat -n | sed -n '4170,4180p'
      4170  # at 59578
      4171  #190419  0:41:48 server id 1  end_log_pos 59609 CRC32 0x36cda2b7        Xid = 6380
      4172  COMMIT/*!*/;
      4173  # at 59609
      4174  #190419  0:41:48 server id 1  end_log_pos 59674 CRC32 0x8de2f06a        Anonymous_GTID  last_committed=145      sequence_number=146
      4175  SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
      4176  # at 59674
      4177  #190419  0:41:48 server id 1  end_log_pos 59787 CRC32 0x6b2edd2b        Query   thread_id=14    exec_time=0     error_code=0
      4178  use `XD`/*!*/;
      4179  SET TIMESTAMP=1555605708/*!*/;
      4180  DROP TABLE `user` /* generated by server */
    [root@xdclass-public log_bin]# 
    ​
    恢復數據:
    
    第一步:把備份的數據表user恢復到數據庫中:mysql -uroot -p XD < /mysql_data_back/user_bak.sql
    
    第二步:利用上面找到的刪除的位置進行恢復數據
    
    mysqlbinlog --no-defaults --set-charset=utf8  --stop-position="59674" /data/mydata/log_bin/mysql-bin.000002 | mysql -uroot -p 
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章