程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 若何應用索引進步查詢速度

若何應用索引進步查詢速度

編輯:MySQL綜合教程

若何應用索引進步查詢速度。本站提示廣大學習愛好者:(若何應用索引進步查詢速度)文章只能為提供參考,不一定能成為您想要的結果。以下是若何應用索引進步查詢速度正文


應用索引進步查詢速度
1.媒介
在web開辟中,頁面模板,營業邏輯(包含緩存、銜接池)和數據庫這三個部門,數據庫在個中擔任履行SQL查詢並前往查詢成果,是影響網站速度最主要的機能瓶頸。本文重要針對MySql數據庫,雙十一的電商年夜戰,激發了淘寶技巧熱議,而淘寶如今去IOE(I代表IBM的縮寫,即去IBM的存儲裝備和小型機;O是代表Oracle的縮寫,也即去Oracle數據庫,采取MySQL和Hadoop替換的處理計劃,;E是代表EMC2,即去EMC2的裝備性,用PC Server替換EMC2),年夜量采取MySql集群!讓MySql再次成為刺眼的明星!而優化數據的主要一步就是索引的樹立,關於mysql中湧現的慢查詢,我們可以經由過程應用索引來晉升查詢速度。索援用於疾速找出在某個列中有一特定值的行。不應用索引,MySQL將停止全表掃描,從第1筆記錄開端然後讀完全個表直到找出相干的行。

2.mysql索引類型及創立
經常使用的索引類型有

(1)主鍵索引
它是一種特別的獨一索引,不許可有空值。普通是在建表的時刻同時創立主鍵索引:

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

(2)通俗索引
這是最根本的索引,它沒有任何限制。創立方法:

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

mysql支撐前綴索引,普通姓名不會跨越20個字符,所以我們這裡樹立索引的時刻限制了長度20,如許可以節儉索引文件年夜小

(3)獨一索引
它與後面的通俗索引相似,分歧的就是:索引列的值必需獨一,但許可有空值。假如是組合索引,則列值的組合必需獨一。創立方法:

CREATE UNIQUE INDEX idx_email ON user(
email
);

(4)全文索引
MySQL支撐全文索引和搜刮功效。MySQL中的全文索引類型為FULLTEXT的索引。  FULLTEXT 索引僅可用於 MyISAM表;

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');

查詢成果:
+----+-------------------+------------------------------------------+
| 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()函數關於一個字符串履行材料庫內的天然說話搜刮。一個材料庫就是1套1個或2個包括在FULLTEXT內的列。搜刮字符串作為對AGAINST()的參數而被給定。關於表中的每行, MATCH() 前往一個相干值,即, 搜刮字符串和 MATCH()表中指定列中該行文字之間的一個類似性器量。
(5)復合索引

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在已知規模內指定值的查詢。是以,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組合索引為“最左前綴”的成果,簡略的懂得就是只從最左面的開端組合。

3.在甚麼情形下應用索引
(1)為搜刮字段建索引,假如在你的表中,某個字段你常常用來做搜刮,那末,請為其樹立索引吧。普通來講,在WHERE和JOIN中湧現的列須要樹立索引以進步查詢速度。
例如從fps表(表中有name字段)中檢索姓名為"李武"的人,
上面用explain來說明履行樹立索引和未樹立索引的差別:

a.未樹立索引前

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


[SQL] select name from fps where name="李武";
影響的數據欄: 0
時光: 0.003ms
b.樹立索引後

create index idx_name on fps(
name
);

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

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

影響的數據欄: 0
時光: 0.001ms

(2)上面我們就來看看這個EXPLAIN剖析成果的寄義。
table:這是表的名字。
type:銜接操作的類型。上面是MySQL文檔關於ref銜接類型的解釋:
“關於每一個來自於後面的表的行組合,一切有婚配索引值的即將從這張表中讀取。假如聯接只應用鍵的最右邊的前綴,或假如鍵不是
UNIQUE或PRIMARY KEY(換句話說,假如聯接不克不及基於症結字選擇單個行的話),則應用ref。假如應用的鍵僅僅婚配大批行,該聯接
類型是不錯的。” 在本例中,因為索引不是UNIQUE類型,ref是我們可以或許獲得的最好銜接類型。 假如EXPLAIN顯示銜接類型是“ALL”,並且你其實不想從內外面選擇出年夜多半記載,那末MySQL的操作效力將異常低,由於它要掃描全部表。你可以參加更多的索引來處理這個成績。預知更多信息,請拜見MySQL的手冊解釋。
possible_keys:
能夠可以應用的索引的名字。這裡的索引名字是創立索引時指定的索引昵稱;假如索引沒有昵稱,則默許顯示的是索引中第一個列的名字
(在本例中,它是“idx_name”)。
Key:
它顯示了MySQL現實應用的索引的名字。假如它為空(或NULL),則MySQL不應用索引。
key_len:
索引中被應用部門的長度,以字節計。
ref:
它顯示的是列的名字(或單詞“const”),MySQL將依據這些列來選擇行。在本例中,MySQL依據三個常量選擇行。
rows:
MySQL所以為的它在找到准確的成果之前必需掃描的記載數。明顯,這裡最幻想的數字就是1。 本例中未索引前遍歷的記載數為1041,而樹立索引後為1
Extra:
這裡能夠湧現很多分歧的選項,個中年夜多半將對查詢發生負面影響。在本例中,MySQL只是提示我們它將用using where,using index子句限制搜刮成果集。

4.最經常使用的存儲引擎:
(1)Myisam存儲引擎:每一個Myisam在磁盤上存儲成三個文件。文件名都和表名雷同,擴大名分離為.frm(存儲表界說)、.MYD(存儲數據)、.MYI(存儲索引)。數據文件和索引文件可以放置在分歧目次,均勻散布io,取得更快的速度。對存儲年夜小沒無限制,MySQL數據庫的最年夜有用表尺寸平日是由操作體系對文件年夜小的限制決議的,
(2)InnoDB存儲引擎:具有提交、回滾、奔潰恢復才能的事務平安。與Myisam比擬,InnoDB的寫效力差一些而且會占用更多的磁盤空間以保存數據和索引。
(3)若何選擇適合的引擎
上面是經常使用存儲引擎實用的情況:
Myisam:它是在Web、數據倉儲和其他運用情況下最常應用的存儲引擎;
InnoDB:用於事務處置運用法式,具有更多特征,包含ACID事務特征。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved