mysql數據庫索引和引擎
1. 數據庫索引
1.1 索引作用
當我們在數據庫表中查詢數據時,若沒有索引,會逐個遍歷表格中的所有記錄,表格中數據記錄量大時很耗時。建立索引就像創建目錄一樣,直接通過索引找到數據存儲位置,加快查找。例如:有一張person表,其中有2W條記錄,記錄著2W個人的信息。有一個Phone的字段記錄每個人的電話號碼,現在想要查詢出電話號碼為xxxx的人的信息。
如果沒有索引,那麽將從表中第一條記錄一條條往下遍歷,直到找到該條信息為止。
如果有了索引,那麽會將該Phone字段,通過一定的方法進行存儲,好讓查詢該字段上的信息時,能夠快速找到對應的數據,而不必在遍歷2W條數據了。其中MySQL中的索引的存儲類型有兩種:BTREE、HASH。 也就是用樹或者Hash值來存儲該字段,要知道其中詳細是如何查找的,就需要會算法的知識了。
但索引也不是越多越好,因為創建的索引也需要占用空間,而且需要維護索引,因此沒必要為所有字段創建索引,對於經常需要查詢,或數據記錄很多的字段可以創建索引。
1.2 索引分類(index或key)
索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引
MyISAM和InnoDB存儲引擎:只支持BTREE索引, 也就是說默認使用BTREE,不能夠更換
MEMORY/HEAP存儲引擎:支持HASH和BTREE索引
索引我們分為四類來講 單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引、
單列索引:一個索引只包含單個列,但一個表中可以有多個單列索引
普通索引, INDEX:MySQL中基本索引類型,沒有什麽限制,允許在定義索引的列中插入重復值和空值,純粹為了查詢數據更快一點。
唯一索引,UNIQUE :索引列中的值必須是唯一的,但是允許為空值,
主鍵索引, PRIMARY KEY:是一種特殊的唯一索引,不允許有空值。
組合索引: 在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引才會被使用,使用組合索引時遵循最左前綴集合。
全文索引 FULLTEXT :只有在MyISAM引擎上才能使用 (MySQL 5.6版本的InnoDB 開始支持全文索引),只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什麽是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該字段所屬的記錄行.
空間索引 SPATIAL : 只有在MyISAM引擎上才能使用(MySQL 5.7版本的InnoDB 開始支持),空間索引是對空間數據類型(坐標,地理位置等)的字段建立的索引,MySQL中的空間數據類型有四種,GEOMETRY、POINT、LINESTRING、POLYGON。創建空間索引的列,必須將其聲明為NOT NULL
1.3 索引操作
1.3.1 創建索引(create index): (創建索引後,通過SHOW CREATE TABLE tbname;能查看)
下面命令給titles表中的title列增加索引 (索引名稱為idxtitle,未命名時默認為該字段名稱),有三種方式如下:
1,創建表格時指定:
CREATE TABLE titles(
title varchar(100),
publID INT,
INDEX idxtitle (title)
);
2,創建索引: CREATE INDEX idxtitle ON titles(title);
3,修改表設計,添加索引: ALTER TABLE titles ADD INDEX idxtitle (title);
1.3.2增加不同的索引:
ALTER TABLE tablename ADD PRIMARY KEY (indexcols..); 不要信索引名稱
ALTER TABLE tablename ADD INDEX [indexname] (indexcols..);
ALTER TABLE tablename ADD UNIQUE [indexname] (indexcols..);
ALTER TABLE tablename ADD FULLTEXT [indexname] (indexcols..);
ALTER TABLE tablename ADD INDEX [indexname] (indexcols1,indexcols2); 為indexcols1,indexcols2兩列創建組合索引
1.3.3刪除索引:
ALTER TABLE tablename DROP PRIMARY KEY ;
ALTER TABLE tablename DROP INDEX [indexname] ;
1.4 索引性能測試:
先創建person表格,通過存儲過程插入5000條數據
--創建表 CREATE TABLE person(id INT, name VARCHAR(16)); --存儲過程 (創建函數,delimiter $$:修改終止符號為$$) delimiter $$ CREATE PROCEDURE autoinsert() BEGIN DECLARE i INT DEFAULT 1; WHILE(i<5000) DO INSERT INTO person VALUES(i,‘zack‘); SET i=i+1; END WHILE; END$$ delimiter ; --調用函數 CALL autoinsert();創建person表
無index時查詢:SELECT * FROM person WHERE id=4900;
添加index後查詢:
ALTER TABLE person ADD INDEX index_id (id);
SELECT * FROM person WHERE id=4900;
可以看出有索引時查詢時間變快。
2,mysql數據庫引擎
https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html
數據庫存儲引擎,是mysql用來處理SQL語句的組件,對每一個數據表格,創建時都需要指定一個數據庫引擎,mysql會使用該引擎來處理這個表格的相應操作,因此對於不同引擎的表格,SQL語句的處理結果和性能會不同。另外,對於一個數據庫中的表格,每個表格都可以指定不同的數據庫引擎。通過命令SHOW ENGINES;能查看mysql支持的數據庫引擎。主要有InnoDB,MyISAM, Memory, CSV, Archve, Blackhole等,常用的就是InnoDB,MyISAM, Memory。其中通過Create table 命令默認設置的引擎為InnoDB。
2.1 設置數據表格引擎:
創建表格時指定:CREATE TABLE titles(id INT, name VARCHAR(16)) ENGINE = InnoDB;
創建後修改:ALTER TABLE titles ENGINE = InnoDB;
(SET default_storage_engine=NDBCLUSTER;
設置默認的引擎)
2.2 InnoDB特點
https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html
InnoDB支持事務操作,即commit,rollback和crash-recovery;
InnoDB支持行級鎖,即可以給一行數據上鎖;
InnoDB支持外鍵關系約束;
2.3 MyISAM特點
https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html
MyISAM 適合讀取操作較多的數據表,其讀取速度較快;
MyISAM支持表級鎖,可以給一張表上鎖;
MyISAM支持全文索引;
MyISAM 支持Gometry,Point等表示空間位置的數據類型;
2.3 Memory:僅存在於內存中,多用於臨時表格(hash index)
3.ODBC和JDBC
ODBC(open database connectivity): windows系統中數據庫系統的一個驅動,基於ODBC的軟件能夠通過ODBC驅動來操控數據庫中的數據。(如excel, access 能夠通過ODBC連接MySQL 數據庫,進行數據的增刪改查
JDBC (java database connectivity):unix和Linux系統上數據庫系統的驅動。
參考博客:https://www.cnblogs.com/whgk/p/6179612.html
http://www.cnblogs.com/yuanchenqi/articles/6357507.html
mysql數據庫索引和引擎