1. 程式人生 > >mysql數據庫索引和引擎

mysql數據庫索引和引擎

直接 ati primary ash 表設計 lose pan isa 重復

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數據庫索引和引擎