高效能的MySQL(5)索引策略-索引案例分析

理解索引最好的辦法是結合執行個體,接下來分析一個例子。假設要設計一個線上約會網站,使用者資訊表有很多列,包括國家,地區,城市,性別,眼睛顏色等等。網站必須支援上面的各種組合來搜尋使用者,包括根據使用者的最後線上時間,評分等進行排序的限制。需要考慮是需要索引來排序還是先檢索資料再排序,因為使用索引排序會嚴格限制索引和查詢的設計。如果MySQL使用了某個索引的範圍查詢,也就無法再使用另一個索引或者是該索引的後續欄位進行排序了。接下來一步步討論:1、支援多種過濾條件country列的選擇性通常不高,但

高效能的MySQL(5)索引策略一壓縮,冗餘,重複,索引和鎖

一、壓縮索引MyISAM使用首碼壓縮來減少索引的大小,預設只壓縮字串,但是通過設定也可以對整數做壓縮。壓縮可以使用更少的空間,代價是某些操作可能更慢。特別是倒序的查詢,測試表明,對於CPU密集型的應用,查詢會很慢,特別是倒序。對於I/O密集型應用,查詢可能會不錯。可以在CREATE TABLE的語句中指定PACK_KEYS參數來指定索引壓縮方式。二、冗餘和重複索引重複索引:指在相同的列上按照相同的順序建立的相同類型的索引,要盡量避免重複索引,除非在同一列上建立不同類型的索引來滿足不同的查詢需求。

高效能的MySQL(5)索引策略-覆蓋索引與索引排序

一、覆蓋索引索引是一種尋找資料的高效方式,但是MySQL也可以使用索引來直接擷取列的資料,這樣就不再需要讀取資料行。如果索引的葉子節點中已經包含要查詢的資料,那麼還有什麼必要回表查詢呢?如果一個索引包含或者說覆蓋所有需要查詢的欄位的值,我們就稱之為“覆蓋索引”。覆蓋索引的好處:1、索引條目通常遠小於資料行大小,所以如果只需要讀取索引,就極大的減少資料訪問量。這對MyISAM尤其正確,因為MyISAM能壓縮索引以變得更小。2、因為索引是按照順序儲存的,所以對於I/O密集型的

高效能的MySQL(5)索引策略一聚簇索引

聚簇索引,並不是一種單獨的索引類型,而是一種資料存放區方式。InnoDB的聚簇索引實際上在同一個結構中儲存了B-Tree索引和資料行資訊。因為無法把資料行存放在兩個不同的地方,所以一個表只能有一個聚簇索引(不過可以通過覆蓋索引來類比,稍後再介紹)。這裡主要討論InnoDB引擎,InnoDB通過主鍵聚集資料,如果沒有主鍵會選擇一個非空的唯一索引,如果還沒有,InnoDB會隱式定義一個主鍵來作為聚簇索引。聚簇索引是一把雙刃劍,要仔細考慮。優點:1、可以把相關資料儲存在一起,例如實現電子郵件時,根據使

高效能的MySQL(5)索引策略

一、索引的優點1、索引可以大大減少伺服器需要掃描的資料量2、索引可以協助伺服器避免排序和暫存資料表。3、索引可以將隨即I/O變為順序I/O二、索引策略1、獨立的列獨立的列是指索引列不能是運算式的一部分,也不能是函數參數。例如:一個有500W條記錄的表,id是主鍵。所以要始終將索引列單獨放在比較符號的一側。2、首碼索引和索引選擇性對於比較大的列,通常可以索引開始的部分字元,這樣可以節約索引空間,提高索引率。但是也會降低索引的選擇性。索引的選擇性是指,不重複的索引值(基數)和表的記錄總數的比值,索引

高效能的MySQL(5)建立高效能的索引一雜湊索引

雜湊索引(hash index)基於雜湊表實現,只有精確匹配索引的所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有索引列計算一個雜湊碼,不同索引值的行計算出來的雜湊碼也不一樣,雜湊碼儲存在雜湊索引中,同時雜湊表中儲存指向每個資料的指標。1、Memory引擎支援雜湊索引,也支援B-Tree索引,而且支援非唯一的雜湊索引,如果多個列的雜湊值相同,索引會以鏈表的方式存放多個記錄指標到同一個雜湊條目,這個是和特別的。舉例說明:CREATE TABLE `testhash` ( `fname`

高效能的MySQL(5)建立高效能的索引一B-Tree索引

一、索引的類型MySQL中,索引是在儲存引擎層實現的,而不是伺服器層,所以沒有統一的標準。MySQL支援的索引類型如下:1、B-Tree索引(也包括B+Tree索引,統稱為B-Tree索引,只是資料結構上的不同,特性上是一樣的)使用B-Tree資料結構來儲存資料,實際上很有儲存引擎使用的是B+Tree。關於BTree、B-Tree、B+Tree的區別請看本部落格的附件。InnoDB就是使用的B+Tree索引。B-Tree通常意味著所有的值都是按順序儲存的,並且每一個葉子頁到跟的距離相同。B-Tr

高效能的MySQL(4)Schema設計

一、設計中的陷阱1、太多的列MySQL的儲存引擎API工作時需要在伺服器層和儲存引擎層之間通過行緩衝格式拷貝資料,然後在伺服器層將緩衝內容解碼為各個列。這是一個代價很高的操作,轉換的代價依賴於列的數量,列太多的話,轉換代價就會很高。2、太多的關聯一個粗略的經驗法則,如果希望查詢和並發行好,單個查詢不要超過10個表的關聯。3、過度的枚舉修改一個枚舉列的值時,需要alter table的阻塞操作,代價很高。4、避免不可能的值CREATE TABLE date_test( dt

高效能的MySQL(4)資料類型的最佳化

一、基本原則1、更小的通常更好更小的資料類型通常更快,因為佔用更少的磁碟、記憶體和CPU緩衝,並且處理時需要的CPU周期也更少。但是要確保沒有低估需要儲存的值的範圍,因為在schema中的多個地方增加資料類型的範圍是個非常耗時的操作。2、簡單就好例如,整數比字串操作代價更低,應該用內建類型而不是字串來儲存時間和日期,用整型儲存IP。3、盡量避免NULL可為NULL的列使用更多的儲存空間,需要特殊的處理。特別是可為NULL的列被索引時,每個索引需要額外的位元組,在Myisam引擎裡甚至還可能導致固

高效能的MySQL(3)單條查詢問題還是伺服器問題

發現問題的時候,要確定是單條查詢的問題還是伺服器的問題,如果伺服器上的所有程式都變慢了,又突然都變好了,每一條查詢都變慢了,那麼慢查詢就不一定是原因,反過來說,如果伺服器整體運行沒有問題,只有某條查詢偶爾變慢,就需要將注意力放到這條特定查詢上。為了確定問題的根源,一般我們通過三種技術來解決。1、show global status這個方法實際就是以較高的頻率比如一秒執行一次show global status命令來捕獲資料,問題出現時,則通過某些計數器(比如

高效能的MySQL(2)單條SQL效能

實際應用中,分析單條查詢SQL效能,有3種方法:show status、show profile和慢查詢日誌。一、使用SHOW PROFILE1、預設是禁用的,在會話中開啟#開啟profileset profiling=1;2、當一個查詢到達伺服器時,此工具會把分析資訊記錄到一張暫存資料表,並且給查詢賦予一個從1開始的整數標識符,可以通過show profiles查看。3、上面只顯示了時間上的精度,但是有些時候我們需要更多的資訊那麼,我們可以使用show profile for query 1;

高效能的MySQL(2)慢查詢

一、剖析MySQL查詢1、首先從慢查詢開始,慢查詢是開銷最低,精度最高的測量查詢時間的工具。a、開始mysql的慢查詢,修改my.conf[mysqld]#開啟慢查詢log_slow_queries = ON#指定記錄檔存放位置,可以為空白,系統會給一個預設的檔案host_name-slow.loglog-slow-queries = /usr/local/mysq/var/slowquery.log#記錄超過的時間,預設為10slong_query_time =

高效能的MySQL(1)鎖和MVCC

一、MySQL邏輯架構二、鎖1、讀寫鎖讀鎖是共用的,是互相不阻塞的,多個客戶在同一時間讀取同一資源,互補幹擾。寫鎖是排他的,會阻塞其他的寫鎖和讀鎖。2、隱式和顯式鎖定隱式:InnoDB,在執行事務過程中會自動加鎖,除非執行COMMIT或ROLLBACK時鎖會自動釋放。顯式:可以使用SELECT...LOCKINSHAREMODE||SELECT...FORUPDATE產生鎖查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/datab

mysql 執行計畫最佳化

一條簡單的SQL 陳述式竟花了15.87 sec,寫道mysql> SELECT x.loc AS loc, x.lastmod AS lastmod, x.changefreq AS changefreq, x.changecount AS changecount, x.priority AS priority, x.language AS language, x.ac cess AS access, x.status AS status FROM xmlsitemap x WHERE

MySQL基礎:觸發器

廢話不多說。自己看看吧.等以後有時間了再完善完善.^-^Sql代碼CREATE TABLE `vardata` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data` double(15,5) DEFAULT '-601.00000',

MySQL基礎:大幅度提高效能方案,分區表

下面就筆者工作中遇到的時間問題,類比一下情況對大家進行介紹.工作中仍然是海量資料出現的情況.每年大概會有幾億條記錄.而且資料的時效性比較強.但曆史資料仍然要求保留.這個時候經過分析和研究,最終決定通過時間欄位進行分區.下面是分區表的建立代碼.讀者門在插入了不同年份時間段以後,可以時間欄位為條件進行查詢,可以看到資料庫掃描過的區段.Sql代碼CREATE TABLE part_data (c1 int default NULL, c2 varchar(30) default

mysql的高效能壓力測試

前言:根據業務需要,需測試mysql 效能和壓力測試.這裡我說下測試方法和 測試過程以及測試中出錯的問題估計很多人 跟我一樣 要測試mysql 的效能 壓力,網上找了很多資料有很多,但是很亂,所以這裡我做個總結,拿自己的真實伺服器測試的。並且 想測多少資料 都能類比出來!這裡只介紹方法。MySQL從5.1.4版開始帶有一個壓力測試工具mysqlslap,通過類比多個並發用戶端訪問mysql來執行測試。[root@localhost smacks]# mysql -Vmysql

Cmake編譯安裝Mysql-5.5

Mysql從5.5開始,原始碼安裝不在使用configure,而是改為cmake,所以,安裝mysql是需要先安裝cmakerpm -ivh cmake-2.6.4-7.el5.i386.rpm安裝前準備groupadd mysqluseradd -g mysql mysqlmkdir /usr/local/mysqlchown mysql.mysql /usr/local/mysql/ -Rmkdir -pv /usr/local/mysql/datayum remove

Mysql備份和AB複製的過程和步驟

Mysql 的完全備份有2種方式1 使用系統命令直接將Mysql資料拷貝進行備份例如/etc/init.d/mysqld stoptar cvfz /var/lib/mysql/mydb_backup.tar.gz /tmp/etc/init.d/mysqld start此種方法必須要先關閉Mysql服務,這也是一大弊端,而且此備份出的資料不支援不同版本的Mysql進行恢複!所以此法生產環境中很少用2 使用mysqldump 進行備份mysqldump

在RedHat 4上安裝MySql 5

1, 從http://www.mysql.com/downloads/ 上下載以下兩個安裝包:MySQL-server-5.5.8-1.linux2.6.x86_64.rpmMySQL-client-5.5.8-1.linux2.6.x86_64.rpm2, 安裝server包:# rpm -ivh MySQL-server-5.5.8-1.linux2.6.x86_64.rpmwarning: MySQL-server-5.5.8-1.linux2.6.x86_64.rpm: V3 DSA

總頁數: 2483 1 .... 1148 1149 1150 1151 1152 .... 2483 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.