• mysql索引优化


    索引在数据库中类似图书馆的目录,合理使用能加快数据库的查询速度。索引在一般使用中,分为单列索引,联合索引(复合索引)

    单列索引

    例如,目前存在一张表,结构如下:

    CREATE TABLE `my_audience_push_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `main_audience_id` varchar(100) NOT NULL COMMENT '主包ID',
      `main_account_id` varchar(50) NOT NULL,
      `account_id` bigint(20) NOT NULL COMMENT '推送账号',
      `audience_id` bigint(20) NOT NULL COMMENT '复制关系的子人群包id',
      `media_type` tinyint(4) NOT NULL DEFAULT '1',
      `type` tinyint(4) NOT NULL COMMENT '0.推送关系  1.复制关系',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=37512 DEFAULT CHARSET=utf8 COMMENT='人群包推送投放记录'
    

    查看|删除索引:

    SHOW INDEX FROM `my_audience_push_test`
    DROP INDEX U_INDEX ON `my_audience_push_test`
    

    1.PRIMARY : 主键索引,唯一且不能为空,一张表中只能有一个主键索引(通常在建表的时候就指定);
    2.NORMAL(Non-Unique)普通索引,索引列没有任何限制:

    CREATE INDEX `idx_main_audience_id`  ON `db_my`.`my_audience_push_test` (main_audience_id) COMMENT '普通索引' ALGORITHM DEFAULT LOCK DEFAULT
    
    ALTER TABLE `my_audience_push_test` ADD INDEX `idx_main_audience_id`(main_audience_id)
    

    3.UNIQUE:唯一索引,索引列的值必须是唯一的,但允许有空。

    ALTER TABLE `my_audience_push_test` ADD UNIQUE `idx_audience_id`(audience_id)
    

    4.FULLTEXT:全文搜索的索引,字段类型为文本类型。用于搜索很长一篇文章的时候,效果最好。如果文本内容较短,用普通的INDEX也可以。

    复合索引

    1.复合索引同样具备NORMAL、UNIQUE、FULLTEXT等类型

    ALTER TABLE `my_audience_push_test2` ADD INDEX `main_audience_id_account_id`(main_audience_id,main_account_id) COMMENT '复合索引'
    

    2.复合索引的最左原则,当创建一个复合索引a,b,c时,基于以下where条件:

    select * from table where a=x and b=y and c=z
    select * from table where a=x and b=y 
    select * from table where b=y and a=x
    select * from table where a=x and c=z
    select * from table where c=z and a=x
    

    才起到索引优化查询的作用,原因复合索引在存储结构上,是先存储a再存储b,c的索引,反之以下语句是不起作用的:

    select * from table where b=y
    select * from table where c=z
    select * from table where b=y and c=z
    

    如果希望条件c=z 或者 b=y起作用,就必须指定a的值才行。

    索引的不足

    1.索引虽然提高了查询速度,但是降低了insert、update、delete的速度,因为这些操作都伴随着对引用的增删改操作;
    2.建立索引时会占用一定的硬盘空间;

    索引使用注意事项

    1.对于单索引的字段,NULL值将不会被包含在索引中;组合索引只有有一列含有NULL值,那么这一列对于组合索引就是无效的,所以在设计数据库的时候尽量避免字段默认值为NULL;
    2.尽量使用短索引(索引一般最大长度不能超过1000字节):
    一般创建索引时,可以指定索引长度,例如某字段为VARCHAR(100)的列,但真实储存的数据只有20位的话,在创建索引时应指定索引的长度为20,如下:

    ALTER TABLE `my_audience_push_test` add INDEX U_INDEX(main_audience_id(20))
    

    3.索引排序:
    Mysql在查询的时候只会使用一个索引,因此如果where子句已经使用了索引的话,那么order by中的列是不会使用索引的,所以order by尽量不要包含多个列的排序,如果非要多列排序,最好使用组合索引。
    4.like语句使用:
    一般不建议使用like语句,如果一定要使用,注意采用like 'aaa%' 而不是 like '%aaa%' ,后者是不会使用到索引的。
    5.不要使用not in 和 <> 操作

    索引方式HASH和BTREE比较

    1.HASH,用于对等比较,如“=”和“<=>”;
    2.BTREE,采用树结构存储索引,通常在类似“ = ,> , < , >= , <= , BETWEEN,like ”等操作查询效率较高,也是MySQL默认的存储结构方法;

  • 相关阅读:
    Beta冲刺
    Beta冲刺总结随笔
    用户使用调查报告
    Beta冲刺测试随笔
    WeChair项目Beta冲刺(10/10)
    WeChair项目Beta冲刺(9/10)
    WeChair项目Beta冲刺(8/10)
    WeChair项目Beta冲刺(7/10)
    WeChair项目Beta冲刺(6/10)
    WeChair项目Beta冲刺(5/10)
  • 原文地址:https://www.cnblogs.com/chq3272991/p/10275616.html
Copyright © 2020-2023  润新知