索引(二)

mysql索引的新手入门详解

mysql索引之三:索引使用注意规则

        索引(Index)是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树(B-tree)。

1. 常见索引原则有

1.1 选择唯一性索引

        唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

1.2 为经常需要排序、分组和联合操作的字段建立索引

1.3 为常作为查询条件的字段建立索引

1.4 限制索引的数目

        越多的索引,会使更新表变得很浪费时间

1.5 尽量使用数据量少的索引

        如果索引的值很长,那么查询的速度会受到影响。

1.6 尽量使用前缀来索引

        如果索引字段的值很长,最好使用值的前缀来索引。

1.7 删除不再使用或者很少使用的索引

1.8 最左前缀匹配原则,非常重要的原则

1.9 尽量选择区分度高的列作为索引

        区分度的公式是表示字段不重复的比

1.10 索引列不能参与计算,保持列“干净”:带函数的查询不参与索引

1.11 尽量的扩展索引,不要新建索引。

2. 索引选取类型

2.1 越小的数据类型通常更好

        越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。

2.2 简单的数据类型更好    

        整型数据比起字符,处理开销更小,因为字符串的比较更复杂。

2.3 尽量避免NULL

        应该指定列为NOT nuLL,在MySQL中, 含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂

3. 索引优缺点

3.1 优点

        索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度

        索引的优点是可以提高检索数据的速度

3.2 缺点

        索引的缺点是创建和维护索引需要耗费时间

        索引可以提高查询速度,会减慢写入速度

        索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

4. 索引分类

4.1 普通索引

   仅加速查询 最基本的索引,没有任何限制,是我们大多数情况下使用到的索引。

   CREATE INDEX index_name(索引名)  on user_info(表名)(name) (字段名);

    eg:CREATE INDEX sudId on test_person (sub_id) ; 

4.2 唯一索引

    与普通索引类型,不同的是:加速查询 + 列值唯一(可以有null)

    CREATE UNIQUE INDEX mail on user_info(name) ;

    eg: CREATE UNIQUE INDEX cardId on test_person(cardId);

4.3 全文索引

        全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表;作用于CHAR、VARCHAR、TEXT数据类型的列。

4.4 组合索引

将几个列作为一条索引进行检索,使用最左匹配原则。

eg:create INDEX tableCard on test_person(table_id,cardId);

5.索引常用操作

5.1 删除索引

方式一:

eg: drop INDEX tableCard on test_person;

方式二:

eg: alter TABLE test_person drop index  tableCard;

5.2 查看索引

show index from test_person;

5.3  通过 EXPLAIN 分析低效 SQL 的执行计划

        通过以上步骤查询到效率低的 SQL 语句后,可以通过 EXPLAIN 或者 DESC 命令获取 MySQL如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。

explain select * from test_personwhere cardId='233909023109328711';

每个列的简单解释如下:

select_type: 表示 SELECT 的类型,常见的取值有

                     SIMPLE(简单表,即不使用表连接或者子查询)

                     PRIMARY(主查询,即外层的查询)

                     UNION(UNION 中的第二个或者后面的查询语句)

                    SUBQUERY(子查询中的第一个 SELECT)等。

table: 输出结果集的表。

 type: 表示表的连接类型,性能由好到差的连接类型为

         system(表中仅有一行,即常量表)

         const(单表中最多有一个匹配行,例如 primary key 或者 unique index)

         eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用 primary key 或者 unique index)

         ref(与 eq_ref 类似,区别在于不是使用 primary key 或者 unique index,而是使用普通的索引)

         ref_or_null(与 ref 类似,区别在于条件中包含对 NULL 的查询)

         index_merge(索引合并优化)

         unique_subquery(in的后面是一个查询主键字段的子查询)

         index_subquery (与 unique_subquery 类似,区别在于 in 的后面是查询非唯一索引字段的子查询)

         range (单表中的范围查询)

         index (对于前面的每一行,都通过查询索引来得到数据)

         all (对于前面的每一行,都通过全表扫描来得到数据)

possible_keys: 表示查询时,可能使用的索引。

key: 表示实际使用的索引。

key_len: 索引字段的长度。

rows: 扫描行的数量。

Extra: 执行情况的说明和描述。

5.4 定期分析表和检查表

分析表的语法如下:

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

        本语句用于分析和存储表的关键字分布,分析的结果将可以使得系统得到准确的统计信息,使得 SQL 能够生成正确的执行计划。如果用户感觉实际执行计划并不是预期的执行计划,执行一次分析表可能会解决问题。在分析期间,使用一个读取锁定对表进行锁定。这对于 MyISAM, BDB 和 InnoDB 表有作用。

eg:ANALYZE TABLE test_person;

5.5 检查表的语法

        检查表的作用是检查一个或多个表是否有错误。 CHECK TABLE 对 MyISAM 和 InnoDB 表有作用。对于 MyISAM 表,关键字统计数据被更新,例如:

CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}


5.6 定期优化表

        如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表(含有 VARCHAR、BLOB 或 TEXT 列的表)进行了很多更改,则应使用 OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费,但OPTIMIZE TABLE 命令只对 MyISAM、BDB 和 InnoDB 表起作用。

优化表的语法如下:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

注意:ANALYZE、CHECK、OPTIMIZE 执行期间将对表进行锁定,因此一定注意要在数据库不繁忙的时候执行相关的操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容