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

如何使用索引提高查詢速度

 更新時間:2013年06月10日 10:16:45   作者:  
本篇文章是對使用索引提高查詢速度的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

使用索引提高查詢速度
1.前言
在web開發(fā)中,頁面模板,業(yè)務(wù)邏輯(包括緩存、連接池)和數(shù)據(jù)庫這三個部分,數(shù)據(jù)庫在其中負(fù)責(zé)執(zhí)行SQL查詢并返回查詢結(jié)果,是影響網(wǎng)站速度最重要的性能瓶頸。本文主要針對MySql數(shù)據(jù)庫,雙十一的電商大戰(zhàn),引發(fā)了淘寶技術(shù)熱議,而淘寶現(xiàn)在去IOE(I代表IBM的縮寫,即去IBM的存儲設(shè)備和小型機(jī);O是代表Oracle的縮寫,也即去Oracle數(shù)據(jù)庫,采用MySQL和Hadoop替代的解決方案,;E是代表EMC2,即去EMC2的設(shè)備性,用PC Server替代EMC2),大量采用MySql集群!讓MySql再次成為耀眼的明星!而優(yōu)化數(shù)據(jù)的重要一步就是索引的建立,對于mysql中出現(xiàn)的慢查詢,我們可以通過使用索引來提升查詢速度。索引用于快速找出在某個列中有一特定值的行。不使用索引,MySQL將進(jìn)行全表掃描,從第1條記錄開始然后讀完整個表直到找出相關(guān)的行。

2.mysql索引類型及創(chuàng)建
常用的索引類型有

(1)主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引:

復(fù)制代碼 代碼如下:

CREATE TABLE user(
id int unsigned not null auto_increment,
name varchar(50) not null,
email varchar(40) not null,
primary key (id)
);

(2)普通索引
這是最基本的索引,它沒有任何限制。創(chuàng)建方式:
復(fù)制代碼 代碼如下:

create index idx_name on user(
name(20)
);

mysql支持前綴索引,一般姓名不會超過20個字符,所以我們這里建立索引的時候限定了長度20,這樣可以節(jié)省索引文件大小

(3)唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。創(chuàng)建方式:
復(fù)制代碼 代碼如下:

CREATE UNIQUE INDEX idx_email ON user(
email
);

(4)全文索引
MySQL支持全文索引和搜索功能。MySQL中的全文索引類型為FULLTEXT的索引。  FULLTEXT 索引僅可用于 MyISAM表;
復(fù)制代碼 代碼如下:

CREATE TABLE articles (
   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   title VARCHAR(200),
   body TEXT,
   FULLTEXT (title,body)
    );

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');

查詢結(jié)果:
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
MATCH()函數(shù)對于一個字符串執(zhí)行資料庫內(nèi)的自然語言搜索。一個資料庫就是1套1個或2個包含在FULLTEXT內(nèi)的列。搜索字符串作為對AGAINST()的參數(shù)而被給定。對于表中的每一行, MATCH() 返回一個相關(guān)值,即, 搜索字符串和 MATCH()表中指定列中該行文字之間的一個相似性度量。
(5)復(fù)合索引

復(fù)制代碼 代碼如下:

CREATE TABLE test (
    id INT NOT NULL,
    last_name CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);

name索引是一個對last_name和first_name的索引。索引可以用于為last_name,或者為last_name和first_name在已知范圍內(nèi)指定值的查詢。因此,name索引用于下面的查詢:
SELECT * FROM test WHERE last_name='Widenius';
SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
但是不能用于SELECT * FROM test WHERE first_name='Michael';這是因為MySQL組合索引為“最左前綴”的結(jié)果,簡單的理解就是只從最左面的開始組合。

3.在什么情況下使用索引
(1)為搜索字段建索引,如果在你的表中,某個字段你經(jīng)常用來做搜索,那么,請為其建立索引吧。一般來說,在WHERE和JOIN中出現(xiàn)的列需要建立索引以提高查詢速度。
例如從fps表(表中有name字段)中檢索姓名為"李武"的人,
下面用explain來解釋執(zhí)行建立索引和未建立索引的區(qū)別:

a.未建立索引前

復(fù)制代碼 代碼如下:

explain select name from fps where name="李武";


[SQL] select name from fps where name="李武";
影響的數(shù)據(jù)欄: 0
時間: 0.003ms
b.建立索引后
復(fù)制代碼 代碼如下:

create index idx_name on fps(
name
);

explain select name from fps where name="李武";

[SQL] select name from fps where name="李武";

影響的數(shù)據(jù)欄: 0
時間: 0.001ms

(2)下面我們就來看看這個EXPLAIN分析結(jié)果的含義。
table:這是表的名字。
type:連接操作的類型。下面是MySQL文檔關(guān)于ref連接類型的說明:
“對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯(lián)接只使用鍵的最左邊的前綴,或如果鍵不是
UNIQUE或PRIMARY KEY(換句話說,如果聯(lián)接不能基于關(guān)鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯(lián)接
類型是不錯的?!?在本例中,由于索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型。 如果EXPLAIN顯示連接類型是“ALL”,而且你并不想從表里面選擇出大多數(shù)記錄,那么MySQL的操作效率將非常低,因為它要掃描整個表。你可以加入更多的索引來解決這個問題。預(yù)知更多信息,請參見MySQL的手冊說明。
possible_keys:
可能可以利用的索引的名字。這里的索引名字是創(chuàng)建索引時指定的索引昵稱;如果索引沒有昵稱,則默認(rèn)顯示的是索引中第一個列的名字
(在本例中,它是“idx_name”)。
Key:
它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。
key_len:
索引中被使用部分的長度,以字節(jié)計。
ref:
它顯示的是列的名字(或單詞“const”),MySQL將根據(jù)這些列來選擇行。在本例中,MySQL根據(jù)三個常量選擇行。
rows:
MySQL所認(rèn)為的它在找到正確的結(jié)果之前必須掃描的記錄數(shù)。顯然,這里最理想的數(shù)字就是1。 本例中未索引前遍歷的記錄數(shù)為1041,而建立索引后為1
Extra:
這里可能出現(xiàn)許多不同的選項,其中大多數(shù)將對查詢產(chǎn)生負(fù)面影響。在本例中,MySQL只是提醒我們它將用using where,using index子句限制搜索結(jié)果集。

4.最常用的存儲引擎:
(1)Myisam存儲引擎:
每個Myisam在磁盤上存儲成三個文件。文件名都和表名相同,擴(kuò)展名分別為.frm(存儲表定義)、.MYD(存儲數(shù)據(jù))、.MYI(存儲索引)。數(shù)據(jù)文件和索引文件可以放置在不同目錄,平均分布io,獲得更快的速度。對存儲大小沒有限制,MySQL數(shù)據(jù)庫的最大有效表尺寸通常是由操作系統(tǒng)對文件大小的限制決定的,
(2)InnoDB存儲引擎:具有提交、回滾、奔潰恢復(fù)能力的事務(wù)安全。與Myisam相比,InnoDB的寫效率差一些并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引。
(3)如何選擇合適的引擎
下面是常用存儲引擎適用的環(huán)境:
Myisam:它是在Web、數(shù)據(jù)倉儲和其他應(yīng)用環(huán)境下最常使用的存儲引擎;
InnoDB:用于事務(wù)處理應(yīng)用程序,具有更多特性,包括ACID事務(wù)特性。

相關(guān)文章

  • mysql 5.7.17 安裝配置方法圖文教程

    mysql 5.7.17 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • mysql 操作數(shù)據(jù)庫基礎(chǔ)詳解

    mysql 操作數(shù)據(jù)庫基礎(chǔ)詳解

    這篇文章主要介紹了mysql 操作數(shù)據(jù)庫基礎(chǔ)詳解,MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性
    2022-08-08
  • Mysql分庫分表實現(xiàn)方式

    Mysql分庫分表實現(xiàn)方式

    這篇文章詳細(xì)介紹了分庫分表的概念,原因,如何實現(xiàn),以及不同中間件的優(yōu)缺點,同時,也介紹了如何進(jìn)行數(shù)據(jù)遷移和擴(kuò)容縮容,以及如何處理分庫分表后的ID和事務(wù)問題
    2025-02-02
  • IP處理函數(shù)inet_aton()和inet_ntoa()使用說明

    IP處理函數(shù)inet_aton()和inet_ntoa()使用說明

    IP處理函數(shù)inet_aton()和inet_ntoa()使用說明,需要的朋友可以參考下
    2012-03-03
  • Starting MySQL.Manager of pid-file quit without updating file.[FAILED]的解決方法

    Starting MySQL.Manager of pid-file quit without updating fil

    因為硬盤滿了,Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
    2010-02-02
  • mysql 表維護(hù)與改造代碼分享

    mysql 表維護(hù)與改造代碼分享

    當(dāng)數(shù)據(jù)庫中表的數(shù)量比較多時,不利于維護(hù),本文將以此問題進(jìn)行詳細(xì)介紹如何維護(hù)mysql表,與如何修改mysql表
    2012-11-11
  • MySQL數(shù)據(jù)庫表約束超詳細(xì)講解

    MySQL數(shù)據(jù)庫表約束超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫表約束的相關(guān)資料,MySQL?約束是用于保持?jǐn)?shù)據(jù)完整性和一致性的規(guī)則,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 查看連接mysql的IP地址的實例方法

    查看連接mysql的IP地址的實例方法

    在本篇文章里小編給大家分享的是一篇關(guān)于查看連接mysql的IP地址的實例方法,有需要的朋友們可以參考下。
    2020-10-10
  • Windows下MySQL服務(wù)啟動常見的兩種方式(適配5.7和8.0)

    Windows下MySQL服務(wù)啟動常見的兩種方式(適配5.7和8.0)

    本文主要介紹了Windows下MySQL服務(wù)啟動常見的兩種方式(適配5.7和8.0),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 淺談MySql?update會鎖定哪些范圍的數(shù)據(jù)

    淺談MySql?update會鎖定哪些范圍的數(shù)據(jù)

    本文主要介紹了記錄一下MySql?update會鎖定哪些范圍的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

漳州市| 青河县| 泰兴市| 清远市| 台南市| 辉南县| 闻喜县| 武汉市| 许昌县| 弋阳县| 观塘区| 镇康县| 贡嘎县| 汝城县| 邢台县| 永年县| 壶关县| 浠水县| 张掖市| 七台河市| 顺昌县| 靖远县| 泰来县| 澜沧| 南澳县| 岚皋县| 崇文区| 海南省| 闻喜县| 正蓝旗| 晋州市| 永顺县| 锦屏县| 石台县| 广州市| 隆子县| 丹巴县| 太白县| 林州市| 南丰县| 苍梧县|