最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分享幾個簡單MySQL優(yōu)化小妙招

 更新時間:2022年03月31日 11:03:01   作者:蘇州程序大白  
這篇文章主要介紹了分享幾個簡單MySQL優(yōu)化小妙招,分享內(nèi)容有、設置大小寫不敏感、MySql?的用戶和權限管理等內(nèi)容,需要的小伙伴可以參考一下,需要的朋友可以參考下

SQL語句執(zhí)行順序

設置大小寫不敏感

  • 查看大小寫是否敏感:show variables like '%lower_case_table_names%'; windows 系統(tǒng)默認大小寫不敏感,但是 linux 系統(tǒng)是大小寫敏感的。
  • 設置大小寫不敏感:在 my.cnf 這個配置文件 [mysqld] 中加入 lower_case_table_names = 1 ,然后重啟服務器。
屬性設置描述
0大小寫敏感
1大小寫不敏感。創(chuàng)建的表,數(shù)據(jù)庫都是以小寫形式存放在磁盤上,對于 sql 語句都是轉(zhuǎn)換為小寫對表和 DB 進行查找
2創(chuàng)建的表和 DB 依據(jù)語句上格式存放,凡是查找都是轉(zhuǎn)換為小寫進行

注意:在設置屬性為大小寫不敏感前就需要將原來的數(shù)據(jù)庫和表轉(zhuǎn)換為小寫,否則會找不到數(shù)據(jù)庫名。 ?

MySql 的用戶和權限管理

用戶管理: ?

-- 創(chuàng)建用戶
create user ahzoo identified by '123456';?

-- 查看用戶和權限的相關信息
select host,user,password,select_priv,insert_priv,drop_priv from mysql.user

-- 修改當前用戶密碼
set password =password('1234');

-- 修改其他用戶密碼
update mysql.user set password=password('123456') where user='ouo';
-- 所有通過user表的操作,都必須使用下面命令才能生效
flush privileges;

-- 修改用戶名
update mysql.user set user='ahzoo' where user='ouo';
flush privileges;

-- 刪除用戶
drop user ouo;
-- 注意:刪除用戶時,不建議使用下面命令進行刪除,因為系統(tǒng)會有殘留信息保留
delete from user where user='ouo'?
flush privileges;

權限管理: ?

授予權限

grant 權限 1,權限 2,…權限 n on 數(shù)據(jù)庫名稱.表名稱 to 用戶名@用戶地址 identified by '密碼';

-- 授予數(shù)據(jù)庫下所有表,所有權限
grant all privileges on testDB.* to ahzoo@localhost identified by '123456';
-- 授予所有庫、表增刪改查權限
grant select,insert,delete,drop on *.* to ahzoo@localhost identified by '123456';
-- 對網(wǎng)絡用戶授權;@'%' 表示對非本地主機用戶授權,不包括localhost
grant all privileges on *.* to ouo@'%' identified by '123456'


-- 查看權限
show grants;

取消權限

revoke [權限 1,權限 2,…權限 n] on 庫名.表名 from 用戶名@用戶地址;

revoke all privileges on testDB.* from ahzoo@localhost;

索引優(yōu)化

在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結構,這些數(shù)據(jù)結構以某種方式引用(指向)數(shù)據(jù), 這樣就可以在這些數(shù)據(jù)結構上實現(xiàn)高級查找算法。這種數(shù)據(jù)結構,就是索引。

下圖就是一種可能的索引方式示例:

左邊是數(shù)據(jù)表,一共有兩列七條記錄,最左邊的是數(shù)據(jù)記錄的物理地址。為了加快 Col2 的查找,可以維護一個 右邊所示的二叉查找樹,每個節(jié)點分別包含索引鍵值和一個指向?qū)獢?shù)據(jù)記錄物理地址的指 針,這樣就可以運用 二叉查找在一定的復雜度內(nèi)獲取到相應數(shù)據(jù),從而快速的檢索出符合條件的記錄。 一般來說索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲的磁盤上。

索引優(yōu)勢: ?

  • 提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的IO成本。
  • 通過索引列對數(shù)據(jù)進行排序,降低數(shù)據(jù)排序的成本,降低了CPU的消耗。

索引劣勢: ?

  • 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件每次更新添加了索引列的字段,都會調(diào)整因為 更新所帶來的鍵值變化后的索引信息。
  • 實際上索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄,所以索引列也是要占用空間的。

MySQL 索引

Btree

MySQL 使用的是 Btree 索引: ?

一顆 b 樹,淺藍色的塊我們稱之為一個磁盤塊,可以看到每個磁盤塊包含幾個數(shù)據(jù)項(深藍色所示)和指針(黃色所示),如磁盤塊 1 包含數(shù)據(jù)項 17 和 35,包含指針 P1、P2、P3,P1 表示小于 17 的磁盤塊,P2 表示在 17 和 35 之間的磁盤塊,P3 表示大于 35 的磁盤塊。

真實的數(shù)據(jù)存在于葉子節(jié)點即 3、5、9、10、13、15、28、29、36、60、75、79、90、99。

非葉子節(jié)點只不存儲真實的數(shù)據(jù),只存儲指引搜索方向的數(shù)據(jù)項,如 17、35 并不真實存在于數(shù)據(jù)表中。

查找過程: ?

如果要查找數(shù)據(jù)項 29,那么首先會把磁盤塊 1 由磁盤加載到內(nèi)存,此時發(fā)生一次 IO,在內(nèi)存中用二分查找確定 29在 17 和 35 之間,鎖定磁盤塊 1 的 P2 指針,內(nèi)存時間因為非常短(相比磁盤的 IO)可以忽略不計,通過磁盤塊 1的 P2 指針的磁盤地址把磁盤塊 3 由磁盤加載到內(nèi)存,發(fā)生第二次 IO,29 在 26 和 30 之間,鎖定磁盤塊 3 的 P2 指針,通過指針加載磁盤塊 8 到內(nèi)存,發(fā)生第三次 IO,同時內(nèi)存中做二分查找找到 29,結束查詢,總計三次 IO。

真實的情況是,3 層的 b+樹可以表示上百萬的數(shù)據(jù),如果上百萬的數(shù)據(jù)查找只需要三次 IO,性能提高將是巨大的,如果沒有索引,每個數(shù)據(jù)項都要發(fā)生一次 IO,那么總共需要百萬次的 IO,顯然成本非常非常高。

?B+tree

B+Tree 與 B-Tree 的區(qū)別: ?

1、B-樹的關鍵字和記錄是放在一起的,葉子節(jié)點可以看作外部節(jié)點,不包含任何信息;B+樹的非葉子節(jié)點中只有關鍵字和指向下一個節(jié)點的索引,記錄只放在葉子節(jié)點中。

2、在 B-樹中,越靠近根節(jié)點的記錄查找時間越快,只要找到關鍵字即可確定記錄的存在;而 B+樹中每個記錄的查找時間基本是一樣的,都需要從根節(jié)點走到葉子節(jié)點,而且在葉子節(jié)點中還要再比較關鍵字。從這個角度看 B- 樹的性能好像要比 B+樹好,而在實際應用中卻是 B+樹的性能要好些。因為 B+樹的非葉子節(jié)點不存放實際的數(shù)據(jù),這樣每個節(jié)點可容納的元素個數(shù)比 B-樹多,樹高比 B-樹小,這樣帶來的好處是減少磁盤訪問次數(shù)。盡管 B+樹找到一個記錄所需的比較次數(shù)要比 B-樹多,但是一次磁盤訪問的時間相當于成百上千次內(nèi)存比較的時間,因此實際中B+樹的性能可能還會好些,而且 B+樹的葉子節(jié)點使用指針連接在一起,方便順序遍歷(例如查看一個目錄下的所有文件,一個表中的所有記錄等),這也是很多數(shù)據(jù)庫和文件系統(tǒng)使用 B+樹的緣故。

為什么 B+樹比 B-樹更適合實際應用中操作系統(tǒng)的文件索引和數(shù)據(jù)庫索引: ?

B+樹的磁盤讀寫代價更低

B+樹的內(nèi)部結點并沒有指向關鍵字具體信息的指針。因此其內(nèi)部結點相對 B 樹更小。如果把所有同一內(nèi)部結點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數(shù)量也越多。一次性讀入內(nèi)存中的需要查找的關鍵字也就越多。相對來說 IO 讀寫次數(shù)也就降低了。

B+樹的查詢效率更加穩(wěn)定

由于非終結點并不是最終指向文件內(nèi)容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數(shù)據(jù)的查詢效率相當。

?聚簇索引和非聚簇索引

聚簇索引并不是一種單獨的索引類型,而是一種數(shù)據(jù)存儲方式。術語‘聚簇’表示數(shù)據(jù)行和相鄰的鍵值聚簇的存儲 在一起。
如下圖,左側的索引就是聚簇索引,因為數(shù)據(jù)行在磁盤的排列和索引排序保持一致。

聚簇索引的好處:

按照聚簇索引排列順序,查詢顯示一定范圍數(shù)據(jù)的時候,由于數(shù)據(jù)都是緊密相連,數(shù)據(jù)庫不不用從多 個數(shù)據(jù)塊中提取數(shù)據(jù),所以節(jié)省了大量的 io 操作。

聚簇索引的限制:

對于 mysql 數(shù)據(jù)庫目前只有 innodb 數(shù)據(jù)引擎支持聚簇索引,而 Myisam 并不支持聚簇索引。 由于數(shù)據(jù)物理存儲排序方式只能有一種,所以每個 Mysql 的表只能有一個聚簇索引。一般情況下就是 該表的主鍵。 為了充分利用聚簇索引的聚簇的特性,所以 innodb 表的主鍵列盡量選用有序的順序 id,而不建議用 無序的 id,比如 uuid 這種

Mysql 索引分類

-- 創(chuàng)建
CREATE [UNIQUE] INDEX [indexName] ON table_name(column))
-- 刪除?
DROP INDEX [indexName] ON tableName;
-- 查看?
SHOW INDEX FROM tableName;

-- 使用Alter命令:

-- 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為 NULL:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)?

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)

-- 添加普通索引,索引值可出現(xiàn)多次:
ALTER TABLE tbl_name ADD INDEX index_name (column_list)?

--該語句指定了索引為 FULLTEXT ,用于全文索引:
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)

單值索引

即一個索引只包含單個列,一個表可以有多個單列索引。 ?

-- 在表創(chuàng)建時直接創(chuàng)建索引
CREATE TABLE customer (
? id INT(10) UNSIGNED AUTO_INCREMENT ,
? customer_no VARCHAR(200),
? customer_name VARCHAR(200),?
? PRIMARY KEY(id), ?
? KEY (customer_name)
);
-- 單獨創(chuàng)建索引:

CREATE INDEX idx_customer_name ON customer(customer_name);

唯一索引

索引列的值必須唯一,但允許有空值。 ?

隨表一起創(chuàng)建:

CREATE TABLE customer (
? id INT(10) UNSIGNED AUTO_INCREMENT ,
? customer_no VARCHAR(200),
? customer_name
?? ?VARCHAR(200),?
? PRIMARY KEY(id),?
? KEY (customer_name),?
? UNIQUE (customer_no)
);

 單獨建唯一索引:

CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no

主鍵索引

設定為主鍵后數(shù)據(jù)庫會自動建立索引,innodb為聚簇索引。 ?

-- 隨表創(chuàng)建
CREATE TABLE customer (
? id INT(10) UNSIGNED AUTO_INCREMENT ,
? customer_no VARCHAR(200),
? customer_name
?? ?VARCHAR(200),?
? PRIMARY KEY(id)
);

-- 單獨建主鍵索引:
ALTER TABLE customer add PRIMARY KEY customer(customer_no)

-- 刪除建主鍵索引:
ALTER TABLE customer drop PRIMARY

復合索引

即一個索引包含多個列。 ?

-- 隨表一起建索引:
CREATE TABLE customer (
? id INT(10) UNSIGNED AUTO_INCREMENT ,
? customer_no VARCHAR(200),
? customer_name
?? ?VARCHAR(200),?
? PRIMARY KEY(id),?
? KEY (customer_name),?
? UNIQUE (customer_name),?
? KEY (customer_no,customer_name)
);

-- 單獨建索引:
CREATE INDEX idx_no_name ON customer(customer_no,customer_name);

索引優(yōu)化

  • 最佳左前綴法則

使用復合索引時,需遵循最左前綴法則(查詢從索引的最左前列開始并且不跳過索引中的列)。即過濾條件要使用索引必須按照索引建立時的順序,依次滿足,一旦跳過某個字段,索引后面的字段都無法被使用。

  • 不要在索引列上做任何計算

索引列上做【計算、函數(shù)、(自動\手動)類型轉(zhuǎn)換】等操作時,會導致索引失效而轉(zhuǎn)向全表掃描。

  • 索引列上不能有范圍查詢

執(zhí)行mysql命令時應將可能做范圍查詢的字段的索引順序放在最后。

  • 盡量使用覆蓋索引

覆蓋索引:SQL 只需要通過索引就可以返回查詢所需要的數(shù)據(jù),而不必通過二級索引查到主鍵之后再去查詢數(shù)據(jù)。即查詢列和索引列時不要使用 select *…而是使用select a,b,c….。

  • 1、使用不等于(!= 或者<>)時,有時會無法使用索引會導致全表掃描。
  • 2、字段的 is null 可以用到索引 而 is not null 不會使用索引。
  • 3、不能使用前綴進行模糊匹配:
... like '%a%' ?√... like '%a' ?? ?√... like 'a%' ?? ?×

使用 union all 或者 union 來替代or示例:

假設abc為索引

-- 索引被使用:
where a = 3;
where a = 3 and b = 5;
where a = 3 and b = 5 and c = 4;

-- 索引未被使用:
where a <> 3;
where abs(a) =3;
where b = 3;
where b = 3 and c = 4;
where c = 4;

-- 使用到a索引,但是未使用b、c索引
where a = 3 and c = 5;
where a = 3 and b > 4 and c = 5;
where a is null and b is not null;

子查詢優(yōu)化

在范圍判斷時,盡量不要使用 not in 和 not exists,使用 left join on xxx i。

排序分組優(yōu)化

  • 無過濾,不索引

where,limt 都相當于一種過濾條件,所以才能使用上索引。

  • 順序錯,必排序

where 兩側列的順序可以變換,效果相同,但是 order by 列的順序不能隨便變換。

  • 方向反,必排序

如果可以用上索引的字段都使用正序或者逆序,實際上是沒有任何影響的,無非將結果集調(diào)換順序。

-- 兩個排序方式都是desc:
select * from mytest where name='ahzoo' order by deptid desc, name desc

如果排序的字段,順序有差異,就需要將差異的部分,進行一次倒置順序,因此還是需要手動排序的。

-- 兩個排序方式相反,一個是降序一個是升序
select * from mytest where name='ahzoo' order by deptid desc, name asc

到此這篇關于分享幾個簡單MySQL優(yōu)化小妙招的文章就介紹到這了,更多相關MySQL優(yōu)化小妙招內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql逗號拼接字符串的關聯(lián)查詢以及統(tǒng)計問題

    Mysql逗號拼接字符串的關聯(lián)查詢以及統(tǒng)計問題

    有時為了數(shù)據(jù)庫簡潔,存放數(shù)據(jù)的時候,某一字段采用逗號隔開的形式進行存儲,下面這篇文章主要給大家介紹了關于Mysql逗號拼接字符串的關聯(lián)查詢以及統(tǒng)計問題的相關資料,需要的朋友可以參考下
    2023-03-03
  • MySQL 千萬級數(shù)據(jù)量如何快速分頁

    MySQL 千萬級數(shù)據(jù)量如何快速分頁

    這篇文章主要介紹了MySQL 千萬級數(shù)據(jù)量如何快速分頁,幫助大家提高MySQL數(shù)據(jù)庫的性能,感興趣的朋友可以了解下
    2020-09-09
  • 干掉一堆mysql數(shù)據(jù)庫,僅需這樣一個shell腳本(推薦)

    干掉一堆mysql數(shù)據(jù)庫,僅需這樣一個shell腳本(推薦)

    這篇文章主要介紹了干掉一堆mysql數(shù)據(jù)庫,僅需這樣一個shell腳本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • MySQL 數(shù)據(jù)類型 詳解

    MySQL 數(shù)據(jù)類型 詳解

    MySQL 的數(shù)值數(shù)據(jù)類型可以大致劃分為兩個類別,一個是整數(shù),另一個是浮點數(shù)或小數(shù)。許多不同的子類型對這些類別中的每一個都是可用的,每個子類型支持不同大小的數(shù)據(jù),并且 MySQL 允許我們指定數(shù)值字段中的值是否有正負之分或者用零填補。
    2009-10-10
  • 快速了解MySQL 索引

    快速了解MySQL 索引

    這篇文章主要介紹了MySQL 索引的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Windows系統(tǒng)下MySQL添加到系統(tǒng)服務方法(mysql解壓版)

    Windows系統(tǒng)下MySQL添加到系統(tǒng)服務方法(mysql解壓版)

    這篇文章主要介紹了Windows系統(tǒng)下MySQL添加到系統(tǒng)服務方法,主要針對mysql解壓版,感興趣的朋友參考下吧
    2016-05-05
  • mysql 8.0.15 版本安裝教程 連接Navicat.list

    mysql 8.0.15 版本安裝教程 連接Navicat.list

    這篇文章主要為大家詳細介紹了mysql 8.0.15 版本安裝教程,連接Navicat.list,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 淺析MySQL索引結構采用B+樹的問題

    淺析MySQL索引結構采用B+樹的問題

    數(shù)據(jù)庫的存儲引擎都是采用B樹或者B+樹來實現(xiàn)索引的存儲,總體來說,我認為技術方案的選型,更多的要根據(jù)具體的業(yè)務場景來決定,并不一定是說B+樹就是最好的選擇,就像MongoDB里面采用B樹結構,本文介紹我對MySQL索引結構采用B+樹的理解
    2022-06-06
  • MySQL SQL語句優(yōu)化的10條建議

    MySQL SQL語句優(yōu)化的10條建議

    這篇文章主要介紹了MySQL中SQL語句優(yōu)化需要注意的10點,,特別是大型高并發(fā)網(wǎng)站,需要的朋友可以參考下
    2014-03-03
  • mysql建庫時提示Specified key was too long max key length is 1000 bytes的問題的解決方法

    mysql建庫時提示Specified key was too long max key length is 1000

    本文將詳細提供mysql建庫時提示Specified key was too long max key length is 1000 bytes的問題的解決方法,有需求的朋友可以參考
    2012-11-11

最新評論

萨迦县| 湖北省| 习水县| 陆河县| 布尔津县| 齐河县| 循化| 天长市| 天全县| 政和县| 临朐县| 突泉县| 潞城市| 额敏县| 道孚县| 绥中县| 循化| 甘谷县| 遵义县| 新竹市| 金堂县| 论坛| 崇信县| 环江| 营山县| 太康县| 浮山县| 宁陕县| 岳西县| 咸宁市| 衡阳市| 喜德县| 平顺县| 黎城县| 五峰| 靖安县| 赣州市| 禹城市| 济宁市| 弋阳县| 祁连县|