MySql : 索引

1.索引的存储分类

        MyISAM 存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和索引是存储在同一个表空间里面,但可以有多个文件组成。MySQL 中索引的存储类型目前只有两种(BTREE 和HASH),具体和表的存储引擎相关:MyISAM 和InnoDB 存储引擎都只支持BTREE 索引;MEMORY/HEAP 存储引擎可以支持HASH和BTREE 索引。

2.MySQL 如何使用索引

        索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是提高SELECT 操作性能的最佳途径。查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。

        2.1使用索引

        在MySQL 中,下列几种情况下有可能使用到索引。
        (1)对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会被使用,举例说明如下。首先按  company_id,moneys 的顺序创建一个复合索引,具体如下:

        

        然后按company_id 进行表查询,具体如下:

        mysql> explain select * from sales2 where company_id = 2006\G;
        *************************** 1. row ***************************
        id: 1
        select_type: SIMPLE
        table: sales2
        type: ref

        possible_keys: ind_sales2_companyid_money

        key: ind_sales2_companyid_moneys
        key_len: 5
        ref: const
        rows: 1
        Extra: Using where        

        1 row in set (0.00 sec)

        可以发现即便where 条件中不是用的company_id 与moneys 的组合条件,索引仍然能用到,这就是索引的前缀特性。但是如果只按moneys 条件查询表,那么索引就不会被用到,具体如下:

        mysql> explain select * from sales2 where moneys = 1\G;
        *************************** 1. row ***************************
        id: 1
        select_type: SIMPLE
        table: sales2
        type: ALL
        possible_keys: NULL
        key: NULL
        key_len: NULL
        ref: NULL
        rows: 1000
        Extra: Using where

        1 row in set (0.00 sec)

        (2)对于使用like 的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,来看下面两个执行计划:

        mysql> explain select * from company2 where name like '%3'\G;
        *************************** 1. row ***************************
        id: 1
        select_type: SIMPLE
        table: company2
        type: ALL
        possible_keys: NULL
        key: NULL
        key_len: NULL
        ref: NULL
        rows: 1000
        Extra: Using where

        1 row in set (0.00 sec)

        mysql> explain select * from company2 where name like '3%'\G;
        *************************** 1. row ***************************
        id: 1
        select_type: SIMPLE
        table: company2
        type: range
        possible_keys: ind_company2_name
        key: ind_company2_name
        key_len: 11
        ref: NULL
        rows: 103
        Extra: Using where

        1 row in set (0.00 sec)

        (3)如果对大的文本进行搜索,使用全文索引而不用使用like ‘%…%’。

       (4)如果列名是索引,使用column_name is null 将使用索引。如下例中查询name 为null的记录就用到了索引.        

        

猜你喜欢

转载自blog.csdn.net/qq_20672231/article/details/80374642