1. 程式人生 > >索引長度與區分度

索引長度與區分度

1:查詢頻繁 2:區分度高  3:長度小  4: 儘量能覆蓋常用查詢欄位.



1: 索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度(佔用記憶體多).


針對列中的值,從左往右擷取部分,來建索引
1: 截的越短, 重複度越高,區分度越小, 索引效果越不好
2: 截的越長, 重複度越低,區分度越高, 索引效果越好,但帶來的影響也越大--增刪改變慢,並間影響查詢速度.


所以, 要在  區分度 + 長度  兩者上,取得一個平衡.


慣用手法: 擷取不同長度,並測試其區分度,

<span style="font-size:18px;">select count(distinct left(word,6))/count(*) from dict; 
+---------------------------------------+
| count(distinct left(word,6))/count(*) |
+---------------------------------------+
|                                0.9992 |
+---------------------------------------+</span>

擷取word欄位長度,從1開始擷取,計算字元字首沒有重複的字元佔全部資料的比例



對於一般的系統應用: 區別度能達到0.1,索引的效能就可以接受.

3:多列索引
 3.1 多列索引的考慮因素---  
列的查詢頻率 , 列的區分度, 
以ecshop商城為例, goods表中的cat_id,brand_id,做多列索引
從區分度看,Brand_id區分度更高, 

select count(distinct cat_id) / count(*) from  goods;
+-----------------------------------+
| count(distinct cat_id) / count(*) |
+-----------------------------------+
|                            0.2903 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql> select count(distinct brand_id) / count(*) from  goods;
+-------------------------------------+
| count(distinct brand_id) / count(*) |
+-------------------------------------+
|                              0.3871 |
+-------------------------------------+
1 row in set (0.00 sec)

但從 商城的實際業務業務看, 顧客一般先選大分類->小分類->品牌,
最終選擇 index(cat_id,brand_id)來建立索引
有如下表(innodb引擎), sql語句在筆記中, 
給定日照市,查詢子地區, 且查詢子地區的功能非常頻繁,
如何優化索引及語句?

+------+-----------+------+
| id   | name      | pid  |
+------+-----------+------+
| .... | .... | .... |
| 1584 | 日照市 | 1476 |
| 1586 | 東港區 | 1584 |
| 1587 | 五蓮縣 | 1584 |
| 1588 | 莒縣    | 1584 |
+------+-----------+------+


1: 不加任何索引,自身連線查詢

explain select s.id,s.name from it_area as p inner join it_area as s on p.id=s.pid   where p.name='日照市' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: p
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3263
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: s
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3263
        Extra: Using where; Using join buffer
2 rows in set (0.00 sec)

2: 給name加索引
explain select s.id,s.name from it_area as p inner join it_area as s on p.id=s.pid   where p.name='日照市' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: p
         type: ref
possible_keys: name
          key: name
      key_len: 93
          ref: const
         rows: 1
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: s
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3243
        Extra: Using where; Using join buffer
2 rows in set (0.00 sec)

3: 在Pid上也加索引
explain select s.id,s.name from it_area as p inner join it_area as s on p.id=s.pid   where p.name='日照市' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: p
         type: ref
possible_keys: name
          key: name
      key_len: 93
          ref: const
         rows: 1
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: s
         type: ref
possible_keys: pid
          key: pid
      key_len: 5
          ref: big_data.p.id
         rows: 4
        Extra: Using where
2 rows in set (0.00 sec)

相關推薦

索引長度區分

1:查詢頻繁 2:區分度高  3:長度小  4: 儘量能覆蓋常用查詢欄位. 1: 索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度(佔用記憶體多). 針對列中的值,從左往右擷取部分,來建索引 1: 截的越短, 重複度越高,區分度越小, 索引效果越不好 2

mysql 索引長度區分

一點 分享 分析 blog 是不是 程序 觀察 name test 首先 索引長度和區分度是相互矛盾的, 索引長度太短,那麽區分度就很低,吧索引長度加長,區分度就高,但是索引也是要占內存的,所以我們需要找到一個平衡點; 那麽這個平衡點怎麽來定? 比如用戶表有個

(轉) SolrCloud之分布式索引Zookeeper的集成

閾值 leader選舉 較高的 配置 配置信息 tail ots 便是 recovery http://blog.csdn.net/ebay/article/details/46549481 作者:Wang, Josh 一、概述 Lucene是一個Java語言

java String長度varchar長度匹配理解(字符和字節長度理解)

轉化 筆記 指定 是我 有一個 ati 法語 itl 情況 java String長度與varchar長度匹配理解(字符和字節長度理解) string中的length()長度,返回的是char的數量,每個char可以存儲世界上任何類型的文字和字符,一個char 而

【物聯網雲端對接-4】通過MQTT協議雲進行雲端通信

src 發布 訂閱 操作 websocket 編寫 通用 頁面 開發 百度雲的天工物聯網服務目前包括:物接入、物解析、物管理、時序數據庫和規則引擎等5大部分,本篇文章僅介紹物接入。 天工物聯網的物接入,從開發者的角度來說相對有些復雜,需要多步操作才能實現一個雲設備的創建,

perl數組的長度元素個數

元素 filter 等於 rar lte 數組下標 ++ print -1 perl數組的長度與元素個數 $#數組名 ---表示數組中最後一個元素的下標,它等於元素個數減1。 @數組名 ---表示數組中元素的個數。 $標量[email protected]數組名

mysql:索引原理慢查詢優化

一個 mark index out 般的 test output 都是 records 一 介紹 二 索引的原理 三 索引的數據結構 三 MySQL索引管理 四 測試索引 五 正確使用索引 六 查詢優化神器-explain 七 慢查詢優化的基本步驟 八 慢日誌管理 九 參

A/B測試發布

目的 目標 交互 交付 場景 範圍 識別 需要 積累 1、A/B測試與灰度發布的理論 產品是多維度的,設計體驗、交互體驗、系統質量、運營支持等等, 測試的目的是為了系統最終的交付,一套各方面都足夠好的系統,而不是文檔上定義的系統,系統是需要不斷進化的。 測試的質疑貫穿產品的

Oracle JDBC:驅動版本區別區分 [轉]

關閉數據庫 使用 windows bsp 需要 多個 批量 version truct classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的區別,之間的差異 在使用Oracle JDBC驅動時,有些問題你是不是通過替

二分索引線段樹分析

比較 如果 -s 存儲 當我 帶來 執行 dex n-1   二分索引樹是一種樹狀數組,其全名為Binary Indexed Tree。二分索引樹可以用作統計作用,用於計某段連續區間中的總和,並且允許我們動態變更區間中存儲的值。二分索引樹和線段樹非常相似,二者都享有相同的O

Linux進程核心調器之主調器schedule--Linux進程的管理調(十九)【轉】

debug and spin block void 進程調度 2.6 standard 出錯 轉自:http://blog.csdn.net/gatieme/article/details/51872594 日期內核版本架構作者GitHubCSDN

MySQL數據庫學習【第九篇】索引原理慢查詢優化

xxx 結構 復合 unix select查詢 全文搜索 等等 學習 獲取數據 一、介紹 1.什麽是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對

MySQL 之 索引原理慢查詢優化

英文 borde 發生 聚集 引擎 返回 位置 時間 pro 一 索引介紹 二 索引類型 三 索引分類 四 聚合索引和輔助索引 五 測試索引 六 正確使用索引 七 組合索引 八 註意事項 九 查詢計劃 十 慢日誌查詢 十一 大數據量分頁優化 1. 索引介紹

自己寫的加密網頁,網盤私密很相似,需要密碼才能訪問(原創)

audio 查詢 數字 code 頁面 time AR 開發 其他 題記: 馬上就要招聘了,所以我打算放置簡歷在自己的網頁上,但是又不想給除了招聘的人,或者我指定的人外看,所以我需要對網頁頁面加密 我找了許多資料,查看了許多所謂的頁面加密,但是有60%左右都是網頁鎖,

mysql數據庫索引優化實踐(一)

都是 分鐘 必備 範圍查詢 無法使用 RM strong span 實踐 前言 mysql數據庫是現在應用最廣泛的數據庫系統。與數據庫打交道是每個Java程序員日常工作之一,索引優化是必備的技能之一。 為什麽要了解索引 真實案例 案例一:大學有段時間學習爬蟲,爬取了知乎30

Linux進程優先級的處理--Linux進程的管理調(二十二)

idle 實時進程調度 height 2.7 borde 等於 calc convert free 日期 內核版本號 架構 作者 GitHu

第一次作業:Linux 2.6.32的進程模型調器分析

範圍 喚醒 最大 被調用 test ini writeback uid endif 1.前言 本文分析的是Linux 2.6.32版的進程模型以及調度器分析。在線查看 源碼下載 本文主要討論以下幾個問題: 什麽是進程?進程是如何產生的?進程都有那些? 在操作系統中,

mysql五:索引原理慢查詢優化

mysql索引原理與慢查詢優化一、介紹1、為何要有索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。2、什麽是索引?

線程池並行

資源 start 創建 sta tel span nds sys 不同的 本節將展示線程池如何工作於大量的異步操作,以及它與創建大量單獨的線程的方式有和不同。 代碼Demo: using System;using System.Threading;using System.

字符串經過base64編碼後的長度原字符串的長度是什麽關系呀?

關系 是什麽 ase 字符 nbsp nco 編碼 base64編碼 字符串 beforeEncode為Encode之前的字符串 那麽Encode後的字符串長度為: 1、如果beforeEncode.length()是3的整數倍,那麽長度為 (beforeEncode.l