国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

正確理解Mysql中的列索引和多列索引

2024-07-24 12:42:24
字體:
來源:轉載
供稿:網友

Mysql數據庫提供兩種類型的索引,如果沒正確設置,索引的利用效率會大打折扣卻完全不知問題出在這。

復制代碼 代碼如下:
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)
);


以上創建的其實是一個多列索引,創建列索引的代碼如下:

復制代碼 代碼如下:
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),
INDEX_2 name (first_name)
);


一個多列索引可以認為是包含通過合并(concatenate)索引列值創建的值的一個排序數組。 當查詢語句的條件中包含last_name 和 first_name時,例如:

復制代碼 代碼如下:
SELECT * FROM test WHERE last_name='Kun' AND first_name='Li';


sql 會先過濾出last_name符合條件的記錄,在其基礎上在過濾first_name符合條件的記錄。那如果我們分別在last_name和 first_name上創建兩個列索引,mysql的處理方式就不一樣了,它會選擇一個最嚴格的索引來進行檢索,可以理解為檢索能力最強的那個索引來檢 索,另外一個利用不上了,這樣效果就不如多列索引了。

但是多列索引的利用也是需要條件的,以下形式的查詢語句能夠利用上多列索引:

復制代碼 代碼如下:
SELECT * FROM test WHERE last_name='Widenius';
SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');
SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';


以下形式的查詢語句利用不上多列索引:

復制代碼 代碼如下:
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';


多列建索引比對每個列分別建索引更有優勢,因為索引建立得越多就越占磁盤空間,在更新數據的時候速度會更慢。
另外建立多列索引時,順序也是需要注意的,應該將嚴格的索引放在前面,這樣篩選的力度會更大,效率更高。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻江县| 尉氏县| 徐汇区| 鄱阳县| 铜鼓县| 庆阳市| 福安市| 南陵县| 澄城县| 东山县| 留坝县| 鹤庆县| 大关县| 岑巩县| 平乐县| 两当县| 迁西县| 红桥区| 昌黎县| 申扎县| 苍山县| 桦南县| 和田市| 城固县| 眉山市| 高平市| 宜州市| 漾濞| 林西县| 亳州市| 赫章县| 德钦县| 高唐县| 龙井市| 宜春市| 山阳县| 新巴尔虎右旗| 旬邑县| 永嘉县| 尉犁县| 驻马店市|