国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        MySQL常見的存儲引擎InnoDB、MyISAM有何區別?

        2021-04-27 09:47
        拓跋阿秀
        關注

        34、創建索引時需要注意什么?

        非空字段:應該指定列為NOT NULL,除非你想存儲NULL。在 MySQL 中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值;

        取值離散大的字段:(變量各個取值之間的差異程度)的列放到聯合索引的前面,可以通過count()函數查看字段的差異值,返回值越大說明字段的唯一值越多字段的離散程度高;

        索引字段越小越好:數據庫的數據存儲以頁為單位一頁存儲的數據越多一次IO操作獲取的數據越大效率越高。唯一、不為空、經常被查詢的字段 的字段適合建索引

        35、MySQL中CHAR和VARCHAR的區別有哪些?

        char的長度是不可變的,用空格填充到指定長度大小,而varchar的長度是可變的。char的存取數度還是要比varchar要快得多char的存儲方式是:對英文字符(ASCII)占用1個字節,對一個漢字占用兩個字節。varchar的存儲方式是:對每個英文字符占用2個字節,漢字也占用2個字節。

        36、MySQL 索引使用的注意事項

        MySQL 索引通常是被用于提高 WHERE 條件的數據行匹配時的搜索速度,在索引的使用過程中,存在一些使用細節和注意事項。

        函數,運算,否定操作符,連接條件,多個單列索引,最左前綴原則,范圍查詢,不會包含有NULL值的列,like 語句不要在列上使用函數和進行運算

        1)不要在列上使用函數,這將導致索引失效而進行全表掃描。

        select * from news where year(publish_time) < 2017

        為了使用索引,防止執行全表掃描,可以進行改造。

        select * from news where publish_time < '2017-01-01'

        還有一個建議,不要在列上進行運算,這也將導致索引失效而進行全表掃描。

        select * from news where id / 100 = 1

        為了使用索引,防止執行全表掃描,可以進行改造。

        select * from news where id = 1 * 100

        2)盡量避免使用 。 或 not in或 <> 等否定操作符

        應該盡量避免在 where 子句中使用 。 或 not in 或 <> 操作符,因為這幾個操作符都會導致索引失效而進行全表掃描。盡量避免使用 or 來連接條件應該盡量避免在 where 子句中使用 or 來連接條件,因為這會導致索引失效而進行全表掃描。

        select * from news where id = 1 or id = 2

        3)多個單列索引并不是最佳選擇

        MySQL 只能使用一個索引,會從多個索引中選擇一個限制最為嚴格的索引,因此,為多個列創建單列索引,并不能提高 MySQL 的查詢性能。假設,有兩個單列索引,分別為 news_year_idx(news_year) 和 news_month_idx(news_month),F在,有一個場景需要針對資訊的年份和月份進行查詢,那么,SQL 語句可以寫成:

        select * from news where news_year = 2017 and news_month = 1

        事實上,MySQL 只能使用一個單列索引。為了提高性能,可以使用復合索引 news_year_month_idx(news_year, news_month) 保證 news_year 和 news_month 兩個列都被索引覆蓋。

        4)復合索引的最左前綴原則

        復合索引遵守“最左前綴”原則,即在查詢條件中使用了復合索引的第一個字段,索引才會被使用。因此,在復合索引中索引列的順序至關重要。如果不是按照索引的最左列開始查找,則無法使用索引。假設,有一個場景只需要針對資訊的月份進行查詢,那么,SQL 語句可以寫成:

        select * from news where news_month = 1

        此時,無法使用 news_year_month_idx(news_year, news_month) 索引,因為遵守“最左前綴”原則,在查詢條件中沒有使用復合索引的第一個字段,索引是不會被使用的。

        5)覆蓋索引的好處

        如果一個索引包含所有需要的查詢的字段的值,直接根據索引的查詢結果返回數據,而無需讀表,能夠極大的提高性能。因此,可以定義一個讓索引包含的額外的列,即使這個列對于索引而言是無用的。

        6)范圍查詢對多列查詢的影響

        查詢中的某個列有范圍查詢,則其右邊所有列都無法使用索引優化查找。舉個例子,假設有一個場景需要查詢本周發布的資訊文章,其中的條件是必須是啟用狀態,且發布時間在這周內。那么,SQL 語句可以寫成:

        select * from news where publish_time >= '2017-01-02' and publish_time <= '2017-01-08' and enable = 1

        這種情況下,因為范圍查詢對多列查詢的影響,將導致 news_publish_idx(publish_time, enable) 索引中 publish_time 右邊所有列都無法使用索引優化查找。換句話說,news_publish_idx(publish_time, enable) 索引等價于 news_publish_idx(publish_time) 。對于這種情況,我的建議:對于范圍查詢,務必要注意它帶來的副作用,并且盡量少用范圍查詢,可以通過曲線救國的方式滿足業務場景。例如,上面案例的需求是查詢本周發布的資訊文章,因此可以創建一個news_weekth 字段用來存儲資訊文章的周信息,使得范圍查詢變成普通的查詢,SQL 可以改寫成:

        select * from news where news_weekth = 1 and enable = 1

        然而,并不是所有的范圍查詢都可以進行改造,對于必須使用范圍查詢但無法改造的情況,我的建議:不必試圖用 SQL 來解決所有問題,可以使用其他數據存儲技術控制時間軸,例如 Redis 的 SortedSet 有序集合保存時間,或者通過緩存方式緩存查詢結果從而提高性能。

        7)索引不會包含有NULL值的列

        只要列中包含有 NULL 值都將不會被包含在索引中,復合索引中只要有一列含有 NULL值,那么這一列對于此復合索引就是無效的。因此,在數據庫設計時,除非有一個很特別的原因使用 NULL 值,不然盡量不要讓字段的默認值為 NULL。

        8)隱式轉換的影響

        當查詢條件左右兩側類型不匹配的時候會發生隱式轉換,隱式轉換帶來的影響就是可能導致索引失效而進行全表掃描。下面的案例中,date_str 是字符串,然而匹配的是整數類型,從而發生隱式轉換。

        select * from news where date_str = 201701

        因此,要謹記隱式轉換的危害,時刻注意通過同類型進行比較。

        9)like 語句的索引失效問題

        like 的方式進行查詢,在 like “value%” 可以使用索引,但是對于 like “%value%” 這樣的方式,執行全表查詢,這在數據量小的表,不存在性能問題,但是對于海量數據,全表掃描是非常可怕的事情。所以,根據業務需求,考慮使用 ElasticSearch 或 Solr 是個不錯的方案。

        37、MySQL中有哪些索引?有什么特點?

        普通索引:僅加速查詢唯一索引:加速查詢 + 列值唯一(可以有null)主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個組合索引:多列值組成一個索引,專門用于組合搜索,其效率大于索引合并全文索引:對文本的內容進行分詞,進行搜索索引合并:使用多個單列索引組合搜索覆蓋索引:select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋聚簇索引:表數據是和主鍵一起存儲的,主鍵索引的葉結點存儲行數據(包含了主鍵值),二級索引的葉結點存儲行的主鍵值。使用的是B+樹作為索引的存儲結構,非葉子節點都是索引關鍵字,但非葉子節點中的關鍵字中不存儲對應記錄的具體內容或內容地址。葉子節點上的數據是主鍵與具體記錄(數據內容)

        38、既然索引有那么多優點,為什么不對表總的每一列創建一個索引呢?

        當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立簇索引,那么需要的空間就會更大。創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加

        39、索引如何提高查詢速度的

        將無序的數據變成相對有序的數據(就像查有目的一樣)

        40、使用索引的注意事項

        在經常需要搜索的列上,可以加快搜索的速度;

        在經常使用在where子句中的列上面創建索引,加快條件的判斷速度。

        將打算加索引的列設置為NOT NULL,否則將導致引擎放棄使用索引而進行全表掃描

        在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間

        避免where子句中對字段施加函數,這會造成無法命中索引

        在中到大型表索引都是非常有效的,但是特大型表的維護開銷會很大,不適合建索引,建立用邏輯索引

        在經常用到連續的列上,這些列主要是由一些外鍵,可以加快連接的速度

        與業務無關時多使用邏輯主鍵,也就是自增主鍵在使用InnoDB時使用與業務無關的自增主鍵作為主鍵,即使用邏輯主鍵,而不要使用業務主鍵。

        刪除長期未使用的索引,不用的索引的存在會造成不必要的性能損耗

        在使用limit offset查詢緩存時,可以借助索引來提高性能。

        <上一頁  1  2  3  下一頁>  
        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          人工智能 獵頭職位 更多
          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 夜夜干影院| 蜜桃av在线| 宁蒗| 1024国产基地| jizz国产| 亚洲xxxxxx| 五月婷视频| 亚州成人AV| 洪湖市| 蜜桃秘?av一区二区三区安全| 9l精品国产一区二区| av熟女在线更新| 安阳县| 精品3P| 乐东| 午夜精品变态另类AV| 盐边县| 日本人妻中文| 五月婷婷开心| 在线啊v中文字幕| 昂仁县| 亚洲无码丝袜| 韩国无码一区二区三区精品| 亚洲制服丝袜在线 | 午夜精品久久久久久久久久老司机| 男人天堂网址| 你懂的网址国产日韩网址| 珲春市| 精品九九视频| 迁西县| 欧美日韩久久| 龙口市| www.yw尤物| 99zyz| 加勒比久久AV| 乐业县| 探花无码| 漳浦县| 亚洲视频91| 一区二区三区欧美| 超碰99在线|