乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Mysql數(shù)據(jù)庫 深度知識點

       頭號碼甲 2022-05-07 發(fā)布于北京
      停止命令:net stop mysql
      啟動命令:net start mysql
       

      mysql登錄命令

      mysql -h ip -P 端口 -u 用戶名 -p
       
      mysql --version 或者mysql -V用于在未登錄情況下,查看本機mysql版本
      select version();:登錄情況下,查看鏈接的庫版本
       
      顯示所有數(shù)據(jù)庫:show databases;
      進入指定的庫:use 庫名;
      顯示當(dāng)前庫中所有的表:show tables;
      查看其他庫中所有的表:show tables from 庫名;
      查看表的創(chuàng)建語句:show create table 表名;
      查看表結(jié)構(gòu):desc 表名;
      查看當(dāng)前所在庫:select database();
       

      mysql語法規(guī)范

      1. 不區(qū)分大小寫,但建議關(guān)鍵字大寫,表名、列名小寫
      2. 每條命令最好用英文分號結(jié)尾
      3. 每條命令根據(jù)需要,可以進行縮進或換行
      4. 注釋
        • 單行注釋:#注釋文字
        • 單行注釋:-- 注釋文字 ,注意, 這里需要加空格
        • 多行注釋:/ **注釋文字 **/

      SQL的語言分類

      • DQL(Data Query Language):數(shù)據(jù)查詢語言
        select 相關(guān)語句
      • DML(Data Manipulate Language):數(shù)據(jù)操作語言
        insert 、update、delete 語句
      • DDL(Data Define Languge):數(shù)據(jù)定義語言
        create、drop、alter 語句
      • TCL(Transaction Control Language):事務(wù)控制語言
        set autocommit=0、start transaction、savepoint、commit、rollback
       
      主要包括以下五大類
      整數(shù)類型:bit、bool、tinyint、smallint、mediumint、int、bigint
      浮點數(shù)類型:float、double、decimal
      字符串類型:char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext
      日期類型:Date、DateTime、TimeStamp、Time、Year
      其他數(shù)據(jù)類型:暫不介紹,用的比較少。
       

      類型(n)說明

      在開發(fā)中,我們會碰到有些定義整型的寫法是int(11),這種寫法個人感覺在開發(fā)過程中沒有什么用途,不過還是來說一下,int(N)我們只需要記住兩點:
      • 無論N等于多少,int永遠占4個字節(jié)
      • N表示的是顯示寬度,不足的用0補足,超過的無視長度而直接顯示整個數(shù)字,但這要整型設(shè)置了unsigned zerofill才有效
       
      decimal采用的是四舍五入 
      float和double采用的是四舍六入五成雙
      什么是四舍六入五成雙?
      就是5以下舍棄5以上進位,如果需要處理數(shù)字為5的時候,需要看5后面是否還有不為0的任何數(shù)字,如果有,則直接進位,如果沒有,需要看5前面的數(shù)字,若是奇數(shù)則進位,若是偶數(shù)則將5舍掉
      char類型占用固定長度,如果存放的數(shù)據(jù)為固定長度的建議使用char類型,如:手機號碼、身份證等固定長度的信息

      數(shù)據(jù)類型選擇的一些建議

      • 選小不選大:一般情況下選擇可以正確存儲數(shù)據(jù)的最小數(shù)據(jù)類型,越小的數(shù)據(jù)類型通常更快,占用磁盤,內(nèi)存和CPU緩存更小。
      • 簡單就好:簡單的數(shù)據(jù)類型的操作通常需要更少的CPU周期,例如:整型比字符操作代價要小得多,因為字符集和校對規(guī)則(排序規(guī)則)使字符比整型比較更加復(fù)雜。
       
      • 盡量避免NULL:盡量制定列為NOT NULL,除非真的需要NULL類型的值,有NULL的列值會使得索引、索引統(tǒng)計和值比較更加復(fù)雜。
      • 浮點類型的建議統(tǒng)一選擇decimal
      • 記錄時間的建議使用int或者bigint類型,將時間轉(zhuǎn)換為時間戳格式,如將時間轉(zhuǎn)換為秒、毫秒,進行存儲,方便走索引
       

      權(quán)限生效時間

      用戶及權(quán)限信息放在庫名為mysql的庫中,mysql啟動時,這些內(nèi)容被讀進內(nèi)存并且從此時生效,所以如果通過直接操作這些表來修改用戶及權(quán)限信息的,需要重啟mysql或者執(zhí)行flush privileges;才可以生效。
      用戶登錄之后,mysql會和當(dāng)前用戶之間創(chuàng)建一個連接,此時用戶相關(guān)的權(quán)限信息都保存在這個連接中,存放在內(nèi)存中,此時如果有其他地方修改了當(dāng)前用戶的權(quán)限,這些變更的權(quán)限會在下一次登錄時才會生效。

      創(chuàng)建用戶

      語法:
      create user 用戶名[@主機名] [identified by '密碼'];
      說明:
      1. 主機名默認值為%,表示這個用戶可以從任何主機連接mysql服務(wù)器
      2. 密碼可以省略,表示無密碼登錄
      通過修改mysql.user表修改密碼
      use mysql;
      update user set authentication_string = password('321') where user = 'test1' and host = '%';
      flush privileges;
       
      給用戶授權(quán):
      grant privileges ON database.table TO 'username'[@'host'] [with grant option]
       
      grant命令說明:
      • priveleges (權(quán)限列表),可以是all,表示所有權(quán)限,也可以是select、update等權(quán)限,多個權(quán)限之間用逗號分開。
      • ON 用來指定權(quán)限針對哪些庫和表,格式為數(shù)據(jù)庫.表名 ,點號前面用來指定數(shù)據(jù)庫名,點號后面用來指定表名,*.* 表示所有數(shù)據(jù)庫所有表。
      • TO 表示將權(quán)限賦予某個用戶, 格式為username@host,@前面為用戶名,@后面接限制的主機,可以是IP、IP段、域名以及%,%表示任何地方。
      • WITH GRANT OPTION 這個選項表示該用戶可以將自己擁有的權(quán)限授權(quán)給別人。注意:經(jīng)常有人在創(chuàng)建操作用戶的時候不指定WITH GRANT OPTION選項導(dǎo)致后來該用戶不能使用GRANT命令創(chuàng)建用戶或者給其它用戶授權(quán)。
        備注:可以使用GRANT重復(fù)給用戶添加權(quán)限,權(quán)限疊加,比如你先給用戶添加一個select權(quán)限,然后又給用戶添加一個insert權(quán)限,那么該用戶就同時擁有了select和insert權(quán)限。

      查看用戶有哪些權(quán)限

      show grants for '用戶名'[@'主機']
      show grants -- 查看當(dāng)前用戶的權(quán)限
      撤銷用戶的權(quán)限:revoke privileges ON database.table FROM '用戶名'[@'主機'];
      刪除用戶:
      1.drop user '用戶名'[@'主機’]
      2.delete from user where user='用戶名' and host='主機';
       
       

      授權(quán)原則說明

      • 只授予能滿足需要的最小權(quán)限,防止用戶干壞事,比如用戶只是需要查詢,那就只給select權(quán)限就可以了,不要給用戶賦予update、insert或者delete權(quán)限
      • 創(chuàng)建用戶的時候限制用戶的登錄主機,一般是限制成指定IP或者內(nèi)網(wǎng)IP段
      • 初始化數(shù)據(jù)庫的時候刪除沒有密碼的用戶,安裝完數(shù)據(jù)庫的時候會自動創(chuàng)建一些用戶,這些用戶默認沒有密碼
      • 為每個用戶設(shè)置滿足密碼復(fù)雜度的密碼
      • 定期清理不需要的用戶,回收權(quán)限或者刪除用戶
       

      總結(jié)

      1. 通過命令的方式操作用戶和權(quán)限不需要刷新,下次登錄自動生效
      2. 通過操作mysql庫中表的方式修改、用戶信息,需要調(diào)用flush privileges;刷新一下,下次登錄自動生效
      3. mysql識別用戶身份的方式是:用戶名+主機
      4. 本文中講到的一些指令中帶主機的,主機都可以省略,默認值為%,表示所有機器
      5. mysql中用戶和權(quán)限的信息在庫名為mysql的庫中
       
       

      修改列

      alter table 表名 modify column 列名 新類型 [約束];
      或者
      alter table 表名 change column 列名 新列名 新類型 [約束];
      2種方式區(qū)別:modify不能修改列名,change可以修改列名
       
      delete單表刪除
      delete [別名] from 表名 [[as] 別名] [where條件];
      注意:
      如果無別名的時候,表名就是別名
      如果有別名,delete后面必須寫別名
      如果沒有別名,delete后面的別名可以省略不寫。
      示例
      -- 刪除test1表所有記錄delete from test1;
      -- 刪除test1表所有記錄delete test1 from test1;
      -- 有別名的方式,刪除test1表所有記錄delete t1 from test1 t1;
      -- 有別名的方式刪除滿足條件的記錄delete t1 from test1 t1 where t1.a>100;
      多表刪除
      可以同時刪除多個表中的記錄,語法如下:
      delete [別名1,別名2] from 表1 [[as] 別名1],表2 [[as] 別名2] [where條件];
      說明:
      別名可以省略不寫,但是需要在delete后面跟上表名,多個表名之間用逗號隔開。
      示例1
      delete t1 from test1 t1,test2 t2 where t1.a=t2.c2;
      刪除test1表中的記錄,條件是這些記錄的字段a在test.c2中存在的記錄
       

      drop,truncate,delete區(qū)別

      • drop (刪除表):刪除內(nèi)容和定義,釋放空間,簡單來說就是把整個表去掉,以后要新增數(shù)據(jù)是不可能的,除非新增一個表。
        drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index),依賴于該表的存儲過程/函數(shù)將被保留,但其狀態(tài)會變?yōu)椋篿nvalid。
        如果要刪除表定義及其數(shù)據(jù),請使用 drop table 語句。
      • truncate (清空表中的數(shù)據(jù)):刪除內(nèi)容、釋放空間但不刪除定義(保留表的數(shù)據(jù)結(jié)構(gòu)),與drop不同的是,只是清空表數(shù)據(jù)而已。
        注意:truncate不能刪除具體行數(shù)據(jù),要刪就要把整個表清空了。
      • delete (刪除表中的數(shù)據(jù)):delete 語句用于刪除表中的行。delete語句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時將該行的刪除操作作為事務(wù)記錄在日志中保存,以便進行進行回滾操作。
        truncate與不帶where的delete :只刪除數(shù)據(jù),而不刪除表的結(jié)構(gòu)(定義)
        truncate table 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。
        對于由foreign key約束引用的表,不能使用truncate table ,而應(yīng)使用不帶where子句的delete語句。由于truncate table 記錄在日志中,所以它不能激活觸發(fā)器。
        delete語句是數(shù)據(jù)庫操作語言(dml),這個操作會放到 rollback segement 中,事務(wù)提交之后才生效;如果有相應(yīng)的 trigger,執(zhí)行的時候?qū)⒈挥|發(fā)。
        truncate、drop 是數(shù)據(jù)庫定義語言(ddl),操作立即生效,原數(shù)據(jù)不放到 rollback segment 中,不能回滾,操作不觸發(fā) trigger。
        如果有自增列,truncate方式刪除之后,自增列的值會被初始化,delete方式要分情況(如果數(shù)據(jù)庫被重啟了,自增列值也會被初始化,數(shù)據(jù)庫未被重啟,則不變)
      • 如果要刪除表定義及其數(shù)據(jù),請使用 drop table 語句
      • 安全性:小心使用 drop 和 truncate,尤其沒有備份的時候,否則哭都來不及
      • 刪除速度,一般來說: drop> truncate > delete
      drop
      truncate
      delete
       
      條件刪除
      不支持
      不支持
      支持
      刪除表結(jié)構(gòu)
      支持
      不支持
      不支持
      事務(wù)的方式刪除
      不支持
      不支持
      支持
      觸發(fā)觸發(fā)器
      別名中有特殊符號的,比如空格,此時別名必須用引號引起來。
       
      不等于符號的使用:
      <> 這個是最早的用法。
      !=是后來才加上的。
      兩者意義相同,在可移植性上前者優(yōu)于后者
      故而sql語句中盡量使用<>來做不等判斷
       
       

       

      like(模糊查詢)

      select 列名 from 表名 where 列 like pattern;
      pattern中可以包含通配符,有以下通配符:
      %:表示匹配任意一個或多個字符
      _:表示匹配任意一個字符。

       

      查詢運算符、like、between and、in、not in對NULL值查詢不起效
       

      <=>(安全等于)

      <=>:既可以判斷NULL值,又可以判斷普通的數(shù)值,可讀性較低,用得較少
       

      總結(jié)

      • like中的%可以匹配一個到多個任意的字符,_可以匹配任意一個字符
      • 空值查詢需要使用IS NULL或者IS NOT NULL,其他查詢運算符對NULL值無效
      • 建議創(chuàng)建表的時候,盡量設(shè)置表的字段不能為空,給字段設(shè)置一個默認值
      • <=>(安全等于)玩玩可以,建議少使用
      語法:
      select 列 from 表 limit [offset,] count;
      說明:
      offset:表示偏移量,通俗點講就是跳過多少行,offset可以省略,默認為0,表示跳過0行;范圍:[0,+∞)。
      count:跳過offset行之后開始取數(shù)據(jù),取count行記錄;范圍:[0,+∞)。
      limit中offset和count的值不能用表達式。
       

      limit中不能使用表達式,limit后面的2個數(shù)字不能為負數(shù)

       

      字段存在相同的值,當(dāng)排序過程中存在相同的值時,沒有其他排序規(guī)則時,mysql懵逼了,不知道怎么排序了; 
      建議:分頁排序時,排序不要有二義性,二義性情況下可能會導(dǎo)致分頁結(jié)果亂序,可以在后面追加一個主鍵排序
      where 多字段同時限制:
      SELECT
      user_id 用戶id,
      price 最大金額,
      the_year 年份
      FROM
      t_order t1
      WHERE
      (t1.user_id , t1.price)
      IN
      (SELECT
      t.user_id, MAX(t.price)
      FROM
      t_order t
      GROUP BY t.user_id);
      現(xiàn)在我們來討論java輸出的順序為何和sql不一致?
      上面java代碼中兩個表的連接查詢使用了嵌套循環(huán),外循環(huán)每執(zhí)行一次,內(nèi)循環(huán)的表都會全部遍歷一次,如果放到mysql中,就相當(dāng)于內(nèi)標全部掃描了一次(一次全表io讀取操作),主表(外循環(huán))如果有n條數(shù)據(jù),那么從表就需要全表掃描n次,表的數(shù)據(jù)是存儲在磁盤中,每次全表掃描都需要做io操作,io操作是最耗時間的,如果mysql按照上面的java方式實現(xiàn),那效率肯定很低。
      那mysql是如何優(yōu)化的呢?
      msql內(nèi)部使用了一個內(nèi)存緩存空間,就叫他join_buffer吧,先把外循環(huán)的數(shù)據(jù)放到j(luò)oin_buffer中,然后對從表進行遍歷,從表中取一條數(shù)據(jù)和join_buffer的數(shù)據(jù)進行比較,然后從表中再取第2條和join_buffer數(shù)據(jù)進行比較,直到從表遍歷完成,使用這方方式來減少從表的io掃描次數(shù),當(dāng)join_buffer足夠大的時候,大到可以存放主表所有數(shù)據(jù),那么從表只需要全表掃描一次(即只需要一次全表io讀取操作)。
      mysql中這種方式叫做Block Nested Loop。
       
       
      字段值為NULL的時候,not in查詢有大坑,這個要注意
      建議創(chuàng)建表的時候,列不允許為空
       

      delimiter關(guān)鍵字  sql語句結(jié)束符

      delimiter用來設(shè)置結(jié)束符,當(dāng)mysql執(zhí)行腳本的時候,遇到結(jié)束符的時候,會把結(jié)束符前面的所有語句作為一個整體運行,存儲過程中的腳本有多個sql,但是需要作為一個整體運行,所以此處用到了delimiter
       
      /*在執(zhí)行過程中出任何異常設(shè)置hasSqlError為TRUE*/
      DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasSqlError=TRUE;
      根據(jù)hasSqlError判斷是否有異常,做回滾和提交操作
       
       
      mysql使用binlog和relaylog記錄數(shù)據(jù)庫的變化
      binlog有三種格式:ROW STATEMENT MIXED ,ROW記錄national數(shù)據(jù)被修改了,修改成了什么樣子;STATEMENT 記錄修改的sql到binlog;MIXED就是以上兩種模式的混合。
      binlog是一個二進制文件,解析binlog有兩種方式:
      1.在命令行使用,show binlog events in 'binlog-filename';方式查看
      2.下載分析binlog,然后通過mysqlbinlog工具進行解析
       
       
      扇區(qū):磁盤存儲的最小單位,扇區(qū)一般大小為512Byte
      磁盤塊:文件系統(tǒng)與磁盤交互的最小單位(計算機系統(tǒng)讀寫磁盤的最小單位),一個磁盤塊由連續(xù)幾個扇區(qū)組成,塊一般大小為4KB
       
      二分法查找數(shù)據(jù)的優(yōu)點:定位數(shù)據(jù)非常快,前提是:目標數(shù)組是有序的。
       

      總結(jié)一下使用索引的一些建議

      1. 在區(qū)分度高的字段上面建立索引可以有效的使用索引,區(qū)分度太低,無法有效的利用索引,可能需要掃描所有數(shù)據(jù)頁,此時和不使用索引差不多
      2. 聯(lián)合索引注意最左匹配原則:必須按照從左到右的順序匹配,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整
      3. 查詢記錄的時候,少使用*,盡量去利用索引覆蓋,可以減少回表操作,提升效率
      4. 有些查詢可以采用聯(lián)合索引,進而使用到索引下推(IPC),也可以減少回表操作,提升效率
      5. 禁止對索引字段使用函數(shù)、運算符操作,會使索引失效
      6. 字符串字段和數(shù)字比較的時候會使索引無效
      7. 模糊查詢'%值%'會使索引無效,變?yōu)槿頀呙?,但?值%'這種可以有效利用索引
      8. 排序中盡量使用到索引字段,這樣可以減少排序,提升查詢效率

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多