MYSQL從入門精通教程

      網友投稿 825 2025-04-01

      Mysql從入門到精通筆記

      來源于有道云筆記

      終端操縱Mysql數據庫

      以管理員身份運行cmd

      net start mysql --------啟動服務

      編輯

      發生系統錯誤 5。

      拒絕訪問。

      啟動:service mysqld start--------------------net start mysql(管理員身份運行)

      停止:服務 mysqld 停止

      重啟:服務 mysqld restart

      重載配置:service mysqld?reload

      mysql -uroot -p 進入本地數據庫

      help 幫助手冊

      編輯

      show variables like "%char%";----查看數據庫編碼情況

      利用標準SQL語句對數據庫操作

      show databases 查看所有數據庫

      show engines 查詢存儲引擎

      describe 數據表名 查看表結構,簡寫desc 查看單列 desc 數據表名 列名

      modify 修改子句定義字段

      show variables like "%char%";------查看數據庫編碼

      編輯

      新建數據庫

      create database new_databases;

      刪除數據庫

      drop database new_database;

      操作數據表

      show tables;(需指定數據庫,use 數據庫)

      show columns from 數據表 顯示數據表屬性,類型等其它信息

      新建數據表

      use new_databases; create table new_table( -> id int, -> username char(10));

      if not exists 屏蔽錯誤

      查詢指定行 select * from 數據表 where 條件表達式

      刪除數據表

      drop table new_table;

      復制表

      create table 數據表名

      as like 源數據表名

      不加as只是復制表的結構不復制內容

      刪除表

      drop table 數據表名

      刪除多張數據表可用逗號“,”分隔

      重命名表

      rename table 源數據表名 to 新數據表名

      可對多個數據表進行重命名,多個表之間用逗號“,”分隔

      查看表數據

      select * from 數據表

      運算符

      ^開頭

      $結尾

      mysql> select id=2,id,name,pwd from tb_admin;

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

      | id=2 | id | name | pwd |

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

      | 0 | 1 | mr | 111 |

      | 1 | 2 | 肖承聰 | 222 |

      | 0 | 3 | 張三 | 333 |

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

      查看id等于2的,id等于2返回值為1,否則0

      插入數據

      insert into 數據表 values(值1,值2...);-----------------------(完整插入)

      insert into 數據表 (列1,列2....)values(值1,值2....);------------(部分插入)

      insert into 數據表 (列1,列2,列3....)

      values(值1,值1,值1)

      ,(值2,值2,值2)

      ,.........

      insert into 數據表

      set id=8,name='xiao',pwd=888;-------------------(指定插入)

      插入查詢結果

      insert into 數據庫名.插入到的表

      (列1,列2....)

      select 列1,列2 from 插入到的表

      修改數據

      update 數據表 set 列=666 where 條件表達式

      查詢指定行 select * from 數據表 where 條件表達式

      刪除數據

      delete from 數據表 where 條件表達式

      truncate table 數據表名--------------清空數據表內容

      更新數據

      update new_table -> set id=2,username="cat" -> where id =1;

      數據查詢

      *代表所有列,可單獨查列1,列2 之間用逗號隔開

      查詢一個數據表

      select * from 數據表

      查詢表中的一列或多列

      select 列1,列2 from 數據表

      從一個表或者多個表獲取數據

      select 數據表1.列,數據表1.列,數據表2.列,數據表2.列 from 數據表1,數據表

      查詢指定數據

      select * from 數據表 where 列=‘查詢的內容’

      select *from 表名 where 列 [not] in (元素1,元素2...)---not可選項 ,相反的意思

      去空格查詢

      rtim

      BETWEEN范圍查詢

      select *from 數據表 where 列 [not] between 取值1 and 取值2

      LIKE字符匹配查詢

      select * from 數據表 where 列 like ‘內容%’----------- %匹配一個或多個---------------- _匹配一個

      IS NULL查詢空值

      select * from 數據表 where 列 is null

      AND,OR多條件查詢

      select * from 數據表 where 條件1 and 條件2....-----需兩個都滿足

      select * from 數據表 where 條件1 or 條件2....-----滿足一個即可

      DISTINCT去除結果中的重復行

      select distinct 列 from 數據表

      ORDER BY對查詢結果排序

      order by 字段名 [asc(升)|esc(降)]

      GROUP BY 分組查詢

      in 查詢(規定多值)=規定一個值

      SELECT?column_name(s)

      FROM?table_name

      WHERE?column_name?IN (value1,value2,...);

      LIMIT限制查詢結果數量

      select * from 數據表 order by id asc limit 3;

      按照id 編號進行升序排序,顯示前3條記錄

      select * from 數據表 order by id asc limit 1,2;

      從編號1開始,查詢兩條記錄

      count()函數 查看()有多少記錄

      sum()函數 計算字段數值總和

      avg( )函數 求表中某個字段取值的平均值

      max()函數 求最大值

      min()函數 最小值

      連接查詢

      EXISTS 子查詢 ,返回一個真假值,判斷括號內的子查詢是否真,真就執行外層查詢

      select *from 數據表 where exists (select * from 數據表 where id =27)

      查詢表中是否存在id值為27,存在則執行括號外層數據表內容

      當exists與其它查詢條件一起使用時,需使用and或者or來連接表達式exists關鍵字

      UNION合并查詢

      select user from數據表1

      union

      select user from 數據表2---------------合并表1和表2user的內容去除重復值

      union all 不去除重復項

      定義表和字段的別名

      為表取別名

      select * from tb_program p where p.talk='PHp';

      tb_program表的別名為p;p.talk表示tb_program表中的talk字段

      為字段取別名

      select talk AS new from tb_program

      正則表達式

      字段名 regexp '匹配方式'

      * 任意多少個

      ^開頭

      $結尾

      . 匹配任意字符包括回車換行符

      [字符集合] 匹配字符集中任意一個字符

      [^字符集合] 匹配除字符集合以外的任意一個字符

      s1|s2|s3 匹配s1,s2和s3中的任意一個字符串

      + 匹配多個該字符之前的字符,包括一個-----------'j+a';查詢字段中a字符前面至少一個j字符的記錄

      字符串{n}匹配字符串出現n次

      字符串{m,n}匹配字符串出現至少m次,最多n次

      CREATE TABLE 時的 SQL PRIMARY KEY 約束

      下面的 SQL 在 "Persons" 表創建時在 "P_Id" 列上創建 PRIMARY KEY 約束:

      MySQL:CREATE TABLE Persons

      ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (P_Id) )

      SQL Server / Oracle / MS Access:CREATE TABLE Persons

      ( P_Id int NOT NULL PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )

      ALTER TABLE 時的 SQL PRIMARY KEY 約束

      當表已被創建時,如需在 "P_Id" 列創建 PRIMARY KEY 約束,請使用下面的 SQL:

      MySQL / SQL Server / Oracle / MS Access:

      ALTER TABLE Persons

      ADD PRIMARY KEY (P_Id)

      如需命名 PRIMARY KEY 約束,并定義多個列的 PRIMARY KEY 約束,請使用下面的 SQL 語法:

      MySQL / SQL Server / Oracle / MS Access:

      ALTER TABLE Persons

      ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

      注釋:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)。

      撤銷 PRIMARY KEY 約束

      如需撤銷 PRIMARY KEY 約束,請使用下面的 SQL:

      MySQL:

      ALTER TABLE Persons

      DROP PRIMARY KEY

      SQL Server / Oracle / MS Access:

      ALTER TABLE Persons

      DROP CONSTRAINT pk_PersonID

      常用函數

      備份數據庫

      備份一個數據庫(終端操作無需進入mysql)

      mysqldump -uroot -p dbname table1 table2....>BackuoName.sql

      dbname:數據庫的名稱

      table1和table2參數表示表的名稱,沒有該參數時將備份整個數據庫

      BackNme.sql 參數表示備份文件的名稱,文件名前可加一個絕對路徑

      使用rot用戶備份tes數據庫下的studen表

      mysqldump -uroot -p test student >D:\student.sql

      備份多個數據庫

      mysqldump -u username -p --databases dbname1 dbname2 >BackName.sql

      加上databases這個選項,后面可以加上很多數據庫的名稱

      備份所有數據庫

      mysqldump -u root -p --all -databases >D:\all.sql

      數據恢復

      mysql -uroot -p [dbname]

      dbname 參數表示數據庫名稱

      指定數據庫名,表示還原該數據庫下的數據表,不指定數據庫名時,表示還原特定一個數據庫

      mysql -u root -p

      表的導入與導出

      musqldump

      mysqldump -u root -p --xml dbname table >D:/name.xml

      將website數據庫下的jsj表導出為xml格式到D盤,文件名為xsgl.xml

      mysqldump -u root -p --xml website jsj >D:/xsgl.xml

      mysql

      mysql -u root -p -e "select * from 語句" dbname >D:/sfzh.txt

      使用-e選項就可執行sql語句,select用來查詢記錄

      mysql -u root -p -e "select * from sfzh" website >D:/sfzh.txt

      編輯

      可用mysql導出xml文件和htnl文件

      mysql -u root -p --xml或html -e "select * from sfzh" website >D:/sfzh.txt

      存儲過程與存儲函數

      創建存儲過程

      create procedure proc_name ([proc_parameter[....]])

      [characteristic.....] routine_body

      sp_name參數時存儲過程的名稱;proc_parameter 表示存儲過程的參數列表;characteristic參數指定存儲過程的特性;routine_body 參數時sql代碼的內容,可以用begin.....end來標識sql代碼的開始和結束。

      proc_parameter中的參數由3部分組成,它們分別時輸入輸出類型,參數名稱和參數類型。其中形式為[in | out | inout ]param_name type。param_name 參數時存儲過程的參數名稱;type參數指定存儲過程的參數類型,可以為mysql數據庫的任意類型。

      mysql存儲過程的語句塊以begin開始,以end結束。內部以分號結束,分號“;”應更改為其它字符,更改結束標志可以用關鍵字delimiter定義,例如:將myql結束符設置為//

      mysql>delimiter //

      編輯

      定義一個輸出變量count_num,存儲過程應用select語句從jsj表中獲取記錄總數,最后將結果傳遞給變量count_num。

      show create count_of_student 查看存儲過程

      創建存儲函數

      create function sp_name ([proc_parameter[,....]])

      returns type

      [characteristic.....] routine_body

      參數

      說明

      sp_name

      存儲函數的名稱

      fun_parameter

      存儲函數的參數列表

      returns type

      指定返回值的類型

      characteristic

      指定存儲過程的特性

      routine_body

      sql代碼的內容

      變量的應用

      1.局部變量

      declare a int

      使用default為變量指定默認值

      declare a int default 10

      2全局變量(會話變量)

      會話變量名以字符’@‘作為起始符

      光標的應用

      創建觸發器

      create trigger 觸發器名 before | after 觸發事件

      on 表名 for each row 執行語句

      for each row 表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器(包括插入,更新,刪除)

      執行語句指觸發器被觸發后執行的程序

      例:

      創建一個由插入命令insert觸發的觸發器auto_save_time

      (1)創建一個名稱為timelog的表格

      編輯

      (2)創建名稱為auot_save_time的觸發器

      定義了結束符為//

      編輯

      接下來通過向jsj表插入一條信息來查看觸發器的作用

      編輯

      編輯

      創建具有多條執行語句的觸發器

      create trigger 觸發器名 before | after 觸發事件

      on 表名 for each row 執行語句

      begin

      執行語句列表

      end

      begin與end之間的多條執行語句需以結束分隔符“;”分開

      創建一個delete觸發多條執行語句的觸發器delete_time_info

      ------創建timeinfo數據表

      create table timeinfo( id int(11) primary key auto_increment, info varchar(50) not null )//

      -------創建由delete觸發多條執行語句的觸發器 delect_time_info

      create trigger delect_time_info after delete on jsj for each row begin insert into timelog(savetime)values(now()); insert into timeinfo(info)values('deleteact'); end //

      ---------執行delete并查看觸發結果

      編輯

      查看觸發器

      show triggers;-------選擇xsgl數據庫查看該數據庫中存在的觸發器

      select * from information_schema.triggers;-------查看數據庫中所有觸發器的詳細信息

      information_schema是mysql中默認存在的庫

      select * from information_schema.reiggers where trigger_name='觸發器名稱';---------查看指定觸發器內容

      刪除觸發器

      drop trigger 觸發器名稱;

      事務的應用

      MyISAM類型的數據表不能支持事務,只有InnoDB或BDB

      create table table_name(field_defitions)type=innodb/bdb

      table_name為表名,而field_defitions為表內定義的字段等屬性,type指定數據表的類型,既可以是inodb也可以是bdb類型

      alter table table_name type=innodb/bdb;----------在原有的數據表中可以更改支持的事務處理的類型

      初始化事務

      start transaction

      創建事務

      向名稱為jsj的數據表插入一條記錄,講解事務的從創建。首先打開數據庫,選定某個數據庫,然后初始化事務,最后創建事務,向指定的數據表中添加記錄

      編輯

      在用戶插入新表為innodb類型或更新原來表類型為innodb時,輸入命令卻提示“The InnoDB feature is disabled;you need 'InnoDB' to have it working”警告,則說明InnoDB表類型并沒有被開啟,用戶需要在MySQL文件目錄下找到my.ini文件,定位skip_innodb選項位置,改為#skip_innodb后保存文件,重新啟動MySQL服務器,即可令數據庫支持innodb類型表。

      提交事務

      commit

      因為事務具有孤立性,并未把結果寫入磁盤中

      撤銷事務

      rollback

      如果執行一個回滾操作,則在start transction(初始化事務)命令后的所有SQL語句都將執行回滾操作。如果用戶開啟事務后,沒有提交事務,則默認為自動回滾狀態,既不保留用戶之前的任何操作

      事務的存在周期

      從start transction指令開始直到用戶輸入commit結束

      事務不支持嵌套,在多個事務中,它自動默認會提交前一個事務,在MySQL中很多命令都隱藏執行commit命令

      編輯

      自動提交

      set autocommit=0;

      關閉自動提交參數

      編輯

      事務的孤立級

      1.serializable(序列號)

      2.repeatable read(可重讀)

      3.read committed(提交后讀)

      4.read uncommitted(未提交讀)

      修改事務的孤立級,必須首先獲取super優先權

      編輯

      獲取當前事務孤立級變量的值

      select @@tx_isolation;

      偽事務

      對MyISAM表進行鎖定操作,以次過程代替事務型表InnoDB,即應用表鎖來實現偽事務

      用表鎖定代替事務

      在MySQL的MyISMAM類型數據表中,并不支持commit和rollback(回滾)命令,當用戶對數據庫執行插入更新刪除等操作時,這些變化的數據都被立即保存在磁盤中。

      (1)為指定數據表添加鎖定

      lock tables table_name lock_type1,lock_type2....

      其中,table_name為被鎖定的表名,lock_type為鎖定類型,該類型包括以讀方式(read)鎖定表;以寫方式(write)鎖定表

      (2)解鎖操作,釋放該表的鎖定狀態

      unlock tables;使用之后,所有處于鎖定狀態都會被釋放

      1.以讀方式鎖定數據表

      lock table tb_admin read;

      編輯

      當以讀鎖定數據表時插入記錄時會出錯

      編輯

      解鎖

      編輯

      lock_type參數中,除了read鎖定,其它的參數可以執行insert操作,或者select,但結果卻不徑相同

      2.以寫方式鎖定數據表

      lock_tables tb_admin write;

      該表是寫鎖定,并不能限制當前鎖定用戶的查詢操作,而再打開一個新用戶會話,重新mysql連接,執行上訴過程查詢,并沒有結果顯示,而釋放鎖定后,其它訪問數據庫的用戶都可以查看數據表的內容。

      事件

      查看事件是否開啟

      show variables like 'event_scheduler'; select @@event_scheduler; show processlist;

      編輯

      開啟事件

      1.通過設置全局參數修改(重啟會恢復原來狀態)

      set global event_scheduler=on;

      2.更改配置文件(始終設置)

      在MySQL的配置文件my.ini(window系統)/my.cng(linux系統)中,找到【mysql】,然后在下面添加event_scheduler=on

      保存并重新啟動mysql服務器

      編輯

      創建事件

      在 MySQL 中,可以通過?CREATE EVENT?語句來創建事件,其語法格式如下:

      CREATE EVENT [IF NOT EXISTS] event_name ??? ON SCHEDULE schedule ??? [ON COMPLETION [NOT] PRESERVE] ??? [ENABLE | DISABLE | DISABLE ON SLAVE] ??? [COMMENT 'comment'] ??? DO event_body;

      編輯

      在 ON SCHEDULE 子句中,參數 schedule 的值為一個 AT 子句,用于指定事件在某個時刻發生,其語法格式如下:

      AT timestamp [+ INTERVAL interval]... ? ? | EVERY interval ? ? [STARTS timestamp [+ INTERVAL interval] ...] ? ? [ENDS timestamp[+ INTERVAL interval]...]

      參數說明如下:

      timestamp:一般用于只執行一次,表示一個具體的時間點,后面加上一個時間間隔,表示在這個時間間隔后事件發生。

      EVERY 子句:用于事件在指定時間區間內每隔多長時間發生一次,其中 STARTS 子句用于指定開始時間;ENDS 子句用于指定結束時間。

      interval:一般用于周期性執行,表示一個從現在開始的時間,其值由一個數值和單位構成。例如,使用“4 WEEK”表示 4 周,使用“'1:10'HOUR_MINUTE”表示 1 小時 10 分鐘。間隔的長短用 DATE_ADD() 函數支配。

      interval 參數可以是以下值:

      YEAR?| QUARTER |?MONTH?|?DAY?|?HOUR?|?MINUTE?|

      WEEK |?SECOND?| YEAR_MONTH | DAY_HOUR | DAY_MINUTE |

      DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND一般情況下,不建議使用不標準(以上未加粗關鍵字)的時間單位。

      例 1

      在 test 數據庫中創建一個名稱為 e_test 的事件,用于每隔 5 秒向表 tb_eventtest 中插入一條數據。

      創建 tb_eventtest 表,SQL 語句和運行結果如下:

      mysql> CREATE TABLE tb_eventtest( -> id INT(11) PRIMARY KEY AUTO_INCREMENT, -> user VARCHAR(20), -> createtime DATETIME); Query OK, 0 rows affected (0.07 sec)

      創建 e_test 事件,SQL 語句和運行結果如下:

      mysql> CREATE EVENT IF NOT EXISTS e_test ON SCHEDULE EVERY 5 SECOND -> ON COMPLETION PRESERVE -> DO INSERT INTO tb_eventtest(user,createtime)VALUES('MySQL',NOW()); Query OK, 0 rows affected (0.04 sec)

      創建事件后,查詢 tb_eventtest 中的數據,SQL 語句和運行結果如下:

      mysql> SELECT * FROM tb_eventtest; +----+-------+---------------------+ | id | user | createtime | +----+-------+---------------------+ | 1 | MySQL | 2020-05-21 10:41:39 | | 2 | MySQL | 2020-05-21 10:41:44 | | 3 | MySQL | 2020-05-21 10:41:49 | | 4 | MySQL | 2020-05-21 10:41:54 | +----+-------+---------------------+ 4 rows in set (0.01 sec)

      從結果可以看出,系統每隔 5 秒插入一條數據,這說明事件創建執行成功了。

      修改事件

      在 MySQL 中,事件創建之后,可以使用?ALTER EVENT?語句修改其定義和相關屬性。

      修改事件的語法格式如下:

      ALTER EVENT event_name

      ON SCHEDULE schedule

      [ON COMPLETION [NOT] PRESERVE]

      [ENABLE | DISABLE | DISABLE ON SLAVE]

      [COMMENT 'comment']

      DO event_body;ALTER EVENT 語句中的子句與創建事務一節中講解的基本相同,這里不再贅述。另外,ALTER EVENT 語句還有一個用法就是讓一個事件關閉或再次讓其活動。

      例 1

      修改 e_test 事件,讓其每隔 30 秒向表 tb_eventtest 中插入一條數據,SQL 語句和運行結果如下所示:

      mysql> ALTER EVENT e_test ON SCHEDULE EVERY 30 SECOND -> ON COMPLETION PRESERVE -> DO INSERT INTO tb_eventtest(user,createtime) VALUES('MySQL',NOW()); Query OK, 0 rows affected (0.04 sec) mysql> TRUNCATE TABLE tb_eventtest; Query OK, 0 rows affected (0.04 sec) mysql> SELECT * FROM tb_eventtest; +----+-------+---------------------+ | id | user | createtime | +----+-------+---------------------+ | 1 | MySQL | 2020-05-21 13:23:49 | | 2 | MySQL | 2020-05-21 13:24:19 | +----+-------+---------------------+ 2 rows in set (0.00 sec)

      由結果可以看出,修改事件后,表 tb_eventtest 中的數據由原來的每 5 秒插入一條,變為每 30 秒插入一條。

      使用 ALTER EVENT 語句還可以臨時關閉一個已經創建的事件。

      例 2

      臨時關閉事件 e_test 的具體代碼如下所示:

      mysql> ALTER EVENT e_test DISABLE;

      Query OK, 0 rows affected (0.00 sec)查詢 tb_eventtest 表中的數據,SQL 語句如下:

      SELECT * FROM tb_eventtest;

      為了確定事件已關閉,可以查詢兩次(每次間隔 1 分鐘)tb_eventtest 表的數據,SQL 語句和運行結果如下所示:

      mysql> TRUNCATE TABLE tb_eventtest;

      Query OK, 0 rows affected (0.05 sec)

      mysql> SELECT * FROM tb_eventtest;

      Empty set (0.00 sec)

      mysql> SELECT * FROM tb_eventtest;

      Empty set (0.00 sec)由結果可以看出,臨時關閉事件后,系統就不再繼續向表 tb_eventtest 中插入數據了。

      刪除事件

      在 MySQL 中,可以使用 DROP EVENT 語句刪除已經創建的事件。語法格式如下:

      DROP EVENT [IF EXISTS] event_name;

      例 3

      刪除事件 e_test,SQL 語句和運行結果如下:

      mysql> DROP EVENT IF EXISTS e_test; Query OK, 0 rows affected (0.01 sec) mysql> SELECT * FROM information_schema.events \G Empty set (0.00 sec)

      MySQL性能優化

      查詢mysql性能

      show status like 'value';

      connection:連接mysql服務器的次數

      uptime:mysql服務器上線時間

      slow_queries:慢查詢的次數

      com_select:查詢操作的次數

      com_insert:插入操作的次數

      com_delete:刪除操作的次數

      mysql中存在查詢InnoDB類型的表的一些參數。例如,Innodb_row_read參數表示select語句查詢的記錄數;Innodb_row_insert參數表示insert語句插入的記錄數等。

      編輯

      優化查詢

      explain select 語句;

      explain select * from jsj; 或describe select * from sfzh;可縮寫desc

      編輯

      各字段所代表的意義:

      id 列:指出在整個查詢中select的位置。

      table 列:存放所查詢的表名。

      type 列:連接類型,該列中存儲很多值,范圍從const到all。

      possible_keys 列:指出為了提高查找速度,在mysql中可以使用的索引。

      key 列:指出實際使用的鍵。

      rows 列:該表的總行數。

      extra 列:包含一些其它信息,設計mysql如何處理查詢。

      索引對查詢速度的影響

      mysql> select * from tb_admin; +----+-----------+-----+ | id | name | pwd | +----+-----------+-----+ | 1 | mr | 111 | | 2 | 肖承聰 | 222 | | 3 | 張三 | 333 | | 4 | 易超超 | 666 | | 7 | 王無 | 777 | | 8 | xiao | 888 | | 5 | zhege | 555 | | 6 | feiwu | 666 | | 9 | huigun | 999 | | 10 | commit | 444 | | 11 | huigun | 121 | | 12 | tijjiao | 123 | | 13 | fule | 134 | +----+-----------+-----+ 13 rows in set (0.00 sec) mysql> explain select * from tb_admin where pwd=666; +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | tb_admin | NULL | ALL | NULL | NULL | NULL | NULL | 13 | 10.00 | Using where | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) ------------------------創建索引前rows是13,意味著數據庫存在的13條數據讀別查詢了一遍 mysql> create index index_name on tb_admin(pwd);------創建索引 Query OK, 13 rows affected (0.09 sec) Records: 13 Duplicates: 0 Warnings: 0 mysql> explain select * from tb_admin where pwd='666'; +----+-------------+----------+------------+------+---------------+------------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+------+---------------+------------+---------+-------+------+----------+-------+ | 1 | SIMPLE | tb_admin | NULL | ref | index_name | index_name | 137 | const | 2 | 100.00 | NULL | +----+-------------+----------+------------+------+---------------+------------+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.05 sec) --------------------------創建索引后查詢從7行減少到2行,減少了服務器的開銷

      使用索引查詢

      1.用關鍵字like優化索引查詢

      explain select * from tb_admin where pwd='6%'; ------- %在6前就起不到優化作用

      2.查詢語句中使用多列索引

      create index index_name on tb_admin(name,pwd); ----應用set時,索引不能正常使用,意味著索引并未在mysql優化中起到作用必須使用第一字段name,索引才可以正常使用

      3.查詢語句中使用關鍵字or

      explain select * from tb_admin where name='張三 or pwd='666';

      優化數據庫結構

      將字段很多的表分解成多個表

      mysql> desc tb_admin1; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | pwd | varchar(30) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+

      聯表查詢:

      select * from tb_admin,tb_admin1 where tb_admin.id=tb_admin1.id;

      編輯

      增加中間表

      優化插入記錄的速度

      1.禁用索引

      alter table 表名 disable keys; 重新開啟 alter table 表名 enable keys;

      新創建的表可等記錄導入以后再創建索引可提高導入數據的速度

      2.禁用唯一性檢查

      set unique_checks=0; 重新開啟 set unique_checks=1;

      3,優化insert語句

      當插入大量數據時,建議使用一個select語句插入多條記錄的方式

      1.分析表

      analyze table 表名1[表名2...];

      在分析過程中,數據庫系統會對表加一個只讀鎖。

      編輯

      上面結果顯示了4條信息

      table:表示表的名稱。

      op:表示執行的操作。analyze表示分析操作,check表示進行檢查查找,optimize表示進行優化操作

      msg_type:表示信息類型,其顯示的值通常為狀態,警告,錯誤或信息。

      msg_text:顯示信息。

      2.檢查表

      check table 表名1[表名2...];

      3.優化表

      optimize table 表名1[表名2...];

      查詢高速緩存

      檢查高速緩存是否開啟

      show variables like '%query_cache%';

      參數說明:

      MYSQL從入門到精通教程

      have_query_cahce:表名服務器在默認安裝條件下,是否已經配置查詢高速緩存。

      query_cache_size:高速緩存分配空間,如果該空間為86,則分配給高速緩存空間的大小為86MB。如果為0,則表名高速緩存關閉

      query_cache_type:判斷高速緩存開啟狀態,范圍為0-2,如果為0或0ff時,表名高速緩存已經關閉;當該值為1或on時表名高速緩存已經打開

      使用高速緩存

      select sql_cache * from 表名;

      * 一旦表由變化,使用這個表的高速緩存就會失效

      Linux MySQL SQL 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:其他文件打開也是一樣出現繪圖框,且刪除不掉
      下一篇:excel保存了卻不見了怎么辦
      相關文章
      国产精品亚洲小说专区| 亚洲jizzjizz在线播放久| 亚洲AV无码片一区二区三区| 亚洲熟妇无码AV| 国产精品亚洲四区在线观看| 亚洲国产高清美女在线观看| 亚洲美女免费视频| 亚洲视频精品在线观看| 亚洲高清免费在线观看| 亚洲精品影院久久久久久| 亚洲精品白色在线发布| 亚洲熟妇无码久久精品| 亚洲欧洲日产专区| 亚洲午夜电影在线观看| 亚洲人成激情在线播放| 亚洲精品伊人久久久久| 亚洲最大av资源站无码av网址| 2020久久精品亚洲热综合一本 | 亚洲精品免费网站| 亚洲最大无码中文字幕| 亚洲欧美日韩国产成人| 日本亚洲高清乱码中文在线观看| 国产成人精品久久亚洲高清不卡 | 亚洲熟妇成人精品一区| 亚洲AV永久无码天堂影院| 麻豆亚洲AV成人无码久久精品 | 91亚洲精品自在在线观看| 亚洲mv国产精品mv日本mv| 中文字幕亚洲综合小综合在线| 亚洲国产成人精品电影| 国产婷婷综合丁香亚洲欧洲| 亚洲AV综合永久无码精品天堂| 在线亚洲精品视频| 亚洲一级特黄大片无码毛片| 亚洲日韩精品A∨片无码| 亚洲av激情无码专区在线播放| 亚洲视频免费在线看| 亚洲最大福利视频| 国产精品亚洲精品日韩动图| 久久久久亚洲AV成人网人人网站| 亚洲精品乱码久久久久久蜜桃不卡 |