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

MySQL對(duì)相同字段創(chuàng)建不同索引解析

 更新時(shí)間:2023年11月22日 10:37:03   作者:愛(ài)可生開(kāi)源社區(qū)  
這篇文章主要為大家介紹了MySQL?對(duì)相同字段創(chuàng)建不同索引解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

MySQL 可以對(duì)相同字段創(chuàng)建不同索引?

Oracle 不允許同一個(gè)字段存在兩個(gè)相同索引,但這個(gè)和 MySQL 的設(shè)計(jì)不太相同,通過(guò)實(shí)驗(yàn),了解一下 MySQL 這種場(chǎng)景的情況。

同事問(wèn)了個(gè)問(wèn)題,MySQL 的某個(gè)測(cè)試庫(kù),發(fā)現(xiàn)有這種情況:

  • 給已設(shè)置為主鍵的列又加了一次索引,如下前兩條 SQL 語(yǔ)句。
  • 給同一個(gè)字段加了 2 次索引,如下后兩條 SQL 語(yǔ)句。
# 情況 1
ALTER TABLE test ADD PRIMARY KEY USING BTREE(ID);
ALTER TABLE test ADD INDEX idx_test01 USING BTREE(ID);
# 情況 2
ALTER TABLE test ADD INDEX idx_test02 USING BTREE(UPDATED):
ALTER TABLE test ADD INDEX idx_test03 USING BTREE(UPDATED);

正常情況只需要一條 SQL 就行?

這種情況是不是沒(méi)有意義?

這兩個(gè)問(wèn)題考察的都是關(guān)于索引的基礎(chǔ)知識(shí),如果對(duì)此很熟悉,答案不言自明,即使不熟悉,只需要做些簡(jiǎn)單的測(cè)試,就可以了解,加深印象。

測(cè)試一

數(shù)據(jù)庫(kù)版本:MySQL 8.0,為表 t 設(shè)置主鍵,再對(duì)同字段加個(gè)索引可以執(zhí)行成功。

alter table t add primary key using btree(id);
alter table t add index idx_t_id using btree(id);

對(duì)字段 c1 創(chuàng)建兩個(gè)索引,都可以執(zhí)行成功。

alter table tbl add index idx_t_001 using btree(c1);
alter table tbl add index idx_t_002 using btree(c1);

以上實(shí)驗(yàn)說(shuō)明:MySQL 中可以對(duì)相同的字段創(chuàng)建多次相同的索引。

測(cè)試二

通過(guò) explain,可以驗(yàn)證出對(duì)于同時(shí)存在 PRIMARY KEY 和普通索引的字段作為檢索條件時(shí),優(yōu)化器會(huì)選擇 PRIMARY KEY 作為 key,這種選擇應(yīng)該和 MySQL 以索引組織表存儲(chǔ)的形式有關(guān),對(duì)于同時(shí)存在兩個(gè)索引名稱(chēng)的相同字段作為檢索條件時(shí),優(yōu)化器會(huì)選擇先創(chuàng)建的索引作為 key,這倒是很像 Oracle 中 RBO 對(duì)于索引選擇的順序判斷邏輯(可能有些不嚴(yán)謹(jǐn),但是因?yàn)橥耆莾蓚€(gè)相同的索引(Oracle 終不會(huì)允許此種情況),cost 應(yīng)該完全一致,所以選擇誰(shuí),好像無(wú)所謂)。

bisal@mysqldb 13:02:  [test]> explain select * from tbl where id=1;
+----+-------------+-------+------------+-------+------------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys    | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+------------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | tbl   | NULL       | const | PRIMARY,idx_t_id | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+------------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.07 sec)

bisal@mysqldb 13:03:  [test]> explain select * from tbl where c1='a';
+----+-------------+-------+------------+------+---------------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys       | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | tbl   | NULL       | ref  | idx_t_001,idx_t_002 | idx_t_001 | 7       | const |    3 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

以上實(shí)驗(yàn)說(shuō)明 MySQL 對(duì)于相同字段的相同索引選擇方面的邏輯。

測(cè)試三

從效果上看,這兩個(gè)索引,保留一個(gè)即可,因?yàn)檫@兩個(gè)索引只是名稱(chēng)不同,索引字段相同的,實(shí)際上就是相同的索引。

ALTER TABLE test ADD INDEX idx_test02 USING BTREE(UPDATED):
ALTER TABLE test ADD INDEX idx_test03 USING BTREE(UPDATED);

但對(duì)于主鍵和索引的這兩個(gè),需要用主鍵這個(gè)。因?yàn)檫@兩個(gè)最主要的區(qū)別就是主鍵除了包含索引外,還需保證唯一,而此處的索引,就是普通索引,不是唯一索引,因此從邏輯上,這兩個(gè)是不等價(jià)。但是由于主鍵包含了索引,因此可以刪除第二個(gè)索引,它屬于重復(fù)的,主鍵的定義包含了索引的定義。

ALTER TABLE test ADD PRIMARY KEY USING BTREE(ID);
ALTER TABLE test ADD INDEX idx_test01 USING BTREE(ID);

MySQL 之所以存在上面的這些問(wèn)題,因?yàn)樗试S創(chuàng)建不同名稱(chēng)相同索引字段的索引,但是如果是 Oracle,情況會(huì)是相同?

Oracle 19c,在主鍵字段上創(chuàng)建索引,會(huì)提示 此列列表已索引 的錯(cuò)誤。在相同字段上創(chuàng)建第二個(gè)索引,也是提示 此列列表已索引 的錯(cuò)誤。說(shuō)明 Oracle 中根本不允許同一個(gè)字段存在兩個(gè)相同索引的情況。

總結(jié)

因此只能說(shuō)不同的數(shù)據(jù)庫(kù),設(shè)計(jì)理念不同,Oracle 更嚴(yán)謹(jǐn)些,MySQL 的容錯(cuò)性魯棒性更突出(可能不太準(zhǔn)確)。使用的時(shí)候,需要對(duì)這些基礎(chǔ)能夠有所了解,才可以針對(duì)合適的場(chǎng)景選擇合適的操作。

以上就是MySQL 對(duì)相同字段創(chuàng)建不同索引解析的詳細(xì)內(nèi)容,更多關(guān)于MySQL字段創(chuàng)建索引的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql 存儲(chǔ)過(guò)程的問(wèn)題

    mysql 存儲(chǔ)過(guò)程的問(wèn)題

    最近我接觸了一本php 與 mysql,老外寫(xiě)的一本書(shū),書(shū)中有個(gè)tshirtshop網(wǎng)店代碼,其中操作數(shù)據(jù)庫(kù)的大多用的是mysql存儲(chǔ)過(guò)程
    2009-06-06
  • mysql 索引合并的使用

    mysql 索引合并的使用

    索引合并是mysql底層為我們提供的智能算法。本文就介紹了mysql 索引合并的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • MySQL5.6解壓版服務(wù)無(wú)法啟動(dòng)之系統(tǒng)錯(cuò)誤1067問(wèn)題

    MySQL5.6解壓版服務(wù)無(wú)法啟動(dòng)之系統(tǒng)錯(cuò)誤1067問(wèn)題

    這篇文章主要介紹了MySQL5.6解壓版服務(wù)無(wú)法啟動(dòng)—系統(tǒng)錯(cuò)誤1067問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • MySQL9.0的兩種部署模式及各個(gè)版本發(fā)布的新功能

    MySQL9.0的兩種部署模式及各個(gè)版本發(fā)布的新功能

    本文主要介紹了MySQL9.0的兩種部署模式及各個(gè)版本發(fā)布的新功能,文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決

    mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決

    死鎖和鎖等待是數(shù)據(jù)庫(kù)運(yùn)維中常見(jiàn)的問(wèn)題,區(qū)別在于死鎖會(huì)自動(dòng)解除,而鎖等待需要手動(dòng)處理,本文就來(lái)介紹一下mysql死鎖(dead lock)與鎖等待(lock wait),感興趣的可以了解一下
    2024-09-09
  • node連接mysql數(shù)據(jù)庫(kù)遇到的問(wèn)題和解決方案

    node連接mysql數(shù)據(jù)庫(kù)遇到的問(wèn)題和解決方案

    這篇文章主要介紹了node連接mysql數(shù)據(jù)庫(kù)遇到的問(wèn)題和解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 通過(guò)Query Profiler查看MySQL語(yǔ)句運(yùn)行時(shí)間的操作方法

    通過(guò)Query Profiler查看MySQL語(yǔ)句運(yùn)行時(shí)間的操作方法

    這篇文章主要介紹了通過(guò)Query Profiler查看MySQL語(yǔ)句運(yùn)行時(shí)間的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • mysql不支持group by的解決方法小結(jié)

    mysql不支持group by的解決方法小結(jié)

    下載安裝的是最新版的mysql5.7.x版本,默認(rèn)是開(kāi)啟了 only_full_group_by 模式的,但開(kāi)啟這個(gè)模式后,原先的 group by 語(yǔ)句就報(bào)錯(cuò),然后又把它移除了
    2020-02-02
  • SQL之各種join小結(jié)詳細(xì)講解

    SQL之各種join小結(jié)詳細(xì)講解

    這篇文章主要介紹了SQL之各種join小結(jié)詳細(xì)講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 淺析一個(gè)MYSQL語(yǔ)法(在查詢(xún)中使用count)的兼容性問(wèn)題

    淺析一個(gè)MYSQL語(yǔ)法(在查詢(xún)中使用count)的兼容性問(wèn)題

    本篇文章是對(duì)MYSQL語(yǔ)法(在查詢(xún)中使用count)的兼容性問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07

最新評(píng)論

原平市| 云林县| 巴林左旗| 黄冈市| 察隅县| 黄大仙区| 西乌珠穆沁旗| 嘉兴市| 老河口市| 木里| 庆云县| 永昌县| 井陉县| 监利县| 呼伦贝尔市| 会理县| 邻水| 新和县| 岫岩| 高州市| 康平县| 孙吴县| 娄底市| 潼南县| 太湖县| 额济纳旗| 额济纳旗| 上蔡县| 清丰县| 巴东县| 乐昌市| 霍城县| 宝坻区| 彝良县| 礼泉县| 霞浦县| 铅山县| 兴业县| 马关县| 开平市| 周宁县|