Ⅰ Mysql中怎樣創建聚集索引和非聚集索引,求創建這兩種索引的SQL語句。謝謝
InnoDB按照主鍵進行聚集,如果沒有定義主鍵,InnoDB會試著使用唯一的非空索引來代替。如果沒有這種索引,InnoDB就會定義隱藏的主鍵然後在上面進行聚集。
所以,對於 聚集索引 來說,你創建主鍵的時候,自動就創建了主鍵的聚集索引。
而普通索引(非聚集索引)的語法,大多數資料庫都是通用的:
CREATE INDEX Syntax
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_type]
index_col_name:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH | RTREE}
[java] view plain
-- 創建無索引的表格
create table testNoPK (
id int not null,
name varchar(10)
);
-- 創建普通索引
create index IDX_testNoPK_Name on testNoPK (name);
Ⅱ Mysql建立索引經驗
在實際開發中使用資料庫時,難免會遇到一些大表數據,對這些數據進行查詢時,有時候SQL會查詢得特別慢,這時候,有經驗的老師傅會告訴你,你看一下哪幾個欄位查的多,加一個索引就好了。
那麼,怎麼合理地建立索引呢?這里分享一下我的一些經驗,如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發完成後,分析一下,去針對大多數的查詢,建立聯合索引。
2、使用聯合索引盡量覆蓋多的條件
這是說在一個慢sql里假如有五個where ,一個 order by ,那麼我們的聯合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數欄位不需要索引
這個意思是,如果一張表裡某個欄位的值只有那麼幾個,那麼你針對這個欄位建立的索引其實沒什麼意義,比如說,一個性別欄位就兩種結果,你建了索引,排序也沒什麼意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數大的數據去建立宴肆,能最大化地利用索引
4、長字元串可以使用前綴索引
我們建立索引的欄位盡量選擇欄位類型知喚較小的,比如一個varchar(20)和varchar(256)的,我們在20的上晌猛轎面建立的索引和在256上就有明顯的差距(字元串那麼長排序也不好排呀,唉)。
當然,如果一定是要對varchar(256)建立索引,我們可以選擇裡面的前20個字元放在索引樹里(這里的20不絕對,選擇能盡量分辨數據的最小字元欄位設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字元進行搜索,但前綴索引無法適用於order by 和 group by。
5、對排序欄位設計索引的優先順序低
如果一個SQL里我們出現了范圍查找,後邊又跟著一個排序欄位,那麼我們優先給范圍查找的欄位設置索引,而不是優先排序。
6、如果出現慢SQL,可以設計一個只針對該條SQL的聯合索引。
不過慢SQL的優化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結果,再針對結果去做相應的改進。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是 執行這條SQL。
Ⅲ 怎麼MySql添加全文索引
使用索引是資料庫性能優化的必備技能之一。在MySQL資料庫中,有四種索引:聚集索引(主鍵索引)、普通索引、唯一索引以及我們這里將要介紹的全文索引(FULLTEXT INDEX)。
全文索引(也稱全文檢索)是目前搜索引擎使用的一種關鍵技術。它能夠利用「分詞技術「等多種演算法智能分析出文本文字中關鍵字詞的頻率及重要性,然後按照一定的演算法規則智能地篩選出我們想要的搜索結果。在這里,我們就不追根究底其底層實現原理了,現在我們來看看在MySQL中如何創建並使用全文索引。
在MySQL中,創建全文索引相對比較簡單。例如,我們有一個文章表(article),其中有主鍵ID(id)、文章標題(title)、文章內容(content)三個欄位。現在我們希望能夠在title和content兩個列上創建全文索引,article表及全文索引的創建SQL語句如下:
--創建article表
CREATE TABLE article (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content) --在title和content列上創建全文索引
);
上面就是在創建表的同時建立全文索引的SQL示例。此外,如果我們想要給已經存在的表的指定欄位創建全文索引,同樣以article表為例,我們可以使用如下SQL語句進行創建:
--給現有的article表的title和content欄位創建全文索引
--索引名稱為fulltext_article
ALTER TABLE article
ADD FULLTEXT INDEX fulltext_article (title, content)
在MySQL中創建全文索引之後,現在就該了解如何使用了。眾所周知,在資料庫中進行模糊查詢是使用LIKE關鍵字進行查詢,例如:
SELECT * FROM article WHERE content LIKE '%查詢字元串%'
那麼,我們使用全文索引也是這樣用的嗎?當然不是,我們必須使用特有的語法才能使用全文索引進行查詢。例如,我們想要在article表的title和content列中全文檢索指定的查詢字元串,可以如下編寫SQL語句:
SELECT * FROM article WHERE MATCH(title, content) AGAINST('查詢字元串')
強烈注意:MySQL自帶的全文索引只能用於資料庫引擎為MyISAM的數據表,如果是其他數據引擎,則全文索引不會生效。此外,MySQL自帶的全文索引只能對英文進行全文檢索,目前無法對中文進行全文檢索。如果需要對包含中文在內的文本數據進行全文檢索,我們需要採用Sphinx(斯芬克斯)/Coreseek技術來處理中文。本站將會在後續文章中對Sphinx以及Coreseek進行介紹。
備注1:目前,使用MySQL自帶的全文索引時,如果查詢字元串的長度過短將無法得到期望的搜索結果。MySQL全文索引所能找到的詞的默認最小長度為4個字元。另外,如果查詢的字元串包含停止詞,那麼該停止詞將會被忽略。
備注2:如果可能,請盡量先創建表並插入所有數據後再創建全文索引,而不要在創建表時就直接創建全文索引,因為前者比後者的全文索引效率要高。
Ⅳ mysql怎麼創建索引
1.添加PRIMARY KEY(主鍵索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文派襲舉索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
下面是更加詳細的方法
MySQL中可以使用alter table這個SQL語句來為表中的欄位添加索引。
使用alter table語句來為表中的欄位添加索引的基本語法是:
ALTER TABLE <表名> ADD INDEX (<欄位>);
我們來嘗塵碧試為test中t_name欄位添加一個索引。
mysql> alter table test add index(t_name);
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
執行成功後,我們來看看結果。
mysql> describe test;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| t_id | int(11) | YES | | NULL | |
| t_name | varchar(50) | NO | MUL | NULL | |
| t_password | char(32) | YES | | NULL | |
| t_birth | date | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
結果可以看出,t_name欄位的Key這一欄由原來的空白變成了MUL。這個MUL是什麼意禪宏思呢?簡單解釋一下:如果Key是MUL,那麼該列的值可以重復,該列是一個非唯一索引的前導列(第一列)或者是一個唯一性索引的組成部分但是可以含有空值NULL。
Ⅳ mysql資料庫創建兩張表之間的聯合索引的sql語句,示例就可以!多謝
ALTERTABLEOrdersADDFOREIGNKEY(Id_P)
REFERENCESPersons(Id_P)
Ⅵ mysql指定sql語句用哪個索引
運行explain +SQL語句,例如:
explain select * from students where phone like '45%'G
圖中
possible_keys:可能被利用的孫返索侍肆引名
key:被利用的索引名
rows:掃描的行數,1表示只掃描了一行說明充分利用了索引,此數自然越少越好
還有查詢則談飢耗時等等都可為查詢語句效率分析提供參數依據
Ⅶ 用mysql查詢某欄位是否有索引怎麼做
顯示一個表所有索引的SQL語句是:
show index from 資料庫名.表名
查返隱看某表某一列上的索引使用下面的SQL語句:
show index from 數據悉世仿庫名.表名睜纖 where column_name like '列名'
下面的SQL語句在我的資料庫上執行成功:
show index from web.clubuser where column_name like 'user'。