美文网首页
千万级表索引优化_2018-12-21

千万级表索引优化_2018-12-21

作者: ongahong | 来源:发表于2018-12-21 17:23 被阅读0次

创建货物品类表

CREATE TABLE classify (
    id serial,
    name VARCHAR (10)
) ENGINE = MYISAM DEFAULT CHARACTER
SET = utf8 COLLATE = utf8_general_ci AUTO_INCREMENT = 1 ROW_FORMAT = COMPACT;

创建货品表

CREATE TABLE goods (
    id serial,
    classify_id INT (11),
    name VARCHAR (10),
    price DOUBLE,
    stock INT (11),
    update_time datetime 
) ENGINE = MYISAM DEFAULT CHARACTER
SET = utf8 COLLATE = utf8_general_ci AUTO_INCREMENT = 1 ROW_FORMAT = COMPACT;

填充货品类别

insert  into classify values
(null,'水果生鲜'),
(null,'日常百货'),
(null,'电子耗材'),
(null,'回收二手'),
(null,'奢侈品');

填充货品数据(1000万条)

begin
declare i int default 0 ;
dd:loop 
insert  into goods values
(null,1,'商品1',20,3232,now()),
(null,2,'商品2',1699,3434,now()),
(null,3,'商品3',4000,6578,now()),
(null,5,'商品5',139,43,now()),
(null,1,'商品6',10000,783,now()),
(null,2,'商品7',110,23,now()),
(null,3,'商品8',12,5555,now()),
(null,4,'商品9',130,458,now()),
(null,1,'商品0',12,893,now());
  commit;
set i = i+10 ;
   if  i = 100000 then leave dd;
  end if;
 end loop dd ;
end

将标的引擎修改为InnoDB(使用MyISAM插入数据迅速)

ALTER TABLE goods ENGINE=InnoDB;
ALTER TABLE classify ENGINE=InnoDB;

或者创建InnoDB引擎插前禁用检查,插入后再回复回来

# 禁用唯一性检查   
set unique_check=0;
# 禁用外键检查    
set foreign_key_checks=0; 
# 禁止自动提交    
set autocommit=0;
# 引用索引      
alter table goods disable keys

创建索引

INDEX `id_index` (`id`) USING BTREE ,
INDEX `name_index` (`name`) USING BTREE ,
INDEX `price_index` (`price`) USING BTREE ,
INDEX `name_id_index` (`name`, `id`) USING BTREE 
INDEX `name_price_stoce_index` (`name`, `price`, `stock`) USING BTREE 
# 货品表(主键id,金额price,产品名称name,产品库存量num)
# price字段单独索引查询时where条件使用一个确切的值时索引有效
EXPLAIN SELECT * FROM goods g WHERE g.price = 15;
# price字段单独索引查询时where条件使用一个范围的值时索引无效
EXPLAIN SELECT * FROM goods g WHERE g.price >= 15;
# price字段单独索引查询时where条件使用一个范围的值,给主键加索引,只检索主键id,索引生效
EXPLAIN SELECT g.id FROM goods g WHERE g.price >= 15;
# 给name,price,stock创建联合索引,对于多列索引,只有在查询条件中使用了这些字段中的第一个字段时,索引才会被使用
EXPLAIN SELECT * FROM goods g WHERE g.name LIKE '1%' AND g.price >= 15  ;
# 试一下1=1对查询的影响,事实证明,跟不加1=1无任何差别!!!
EXPLAIN SELECT * FROM goods g WHERE 1=1 AND g.name LIKE '1%' AND g.price >= 15  ;
在子查询中,主句连接的索引无效,子句连接的索引有效
EXPLAIN SELECT * FROM classify c  WHERE c.id in (select g.classify_id from goods g where g.price>=2000) ;
# 使用EXISTS关键字替换IN优化
EXPLAIN SELECT * FROM classify c  WHERE  EXISTS (select g.classify_id from goods g where g.classify_id = c.id AND g.price>2000) ;

# 不加order by 默认返回主键的顺序,千万级1.5秒
EXPLAIN SELECT * FROM goods g LIMIT 2000000,10;
# 加order by 没有走索引,千万级11秒
EXPLAIN SELECT * FROM goods g  order by g.id  LIMIT 2000000,10;
# 加order by 走id主键索引,千万级1.2秒
EXPLAIN SELECT g.id FROM goods g order by g.id LIMIT 2000000,10;
# 加order by 走id主键索引,千万级0.6秒
EXPLAIN SELECT * FROM goods g WHERE g.id >= (SELECT sg.id FROM goods sg ORDER BY sg.id LIMIT 2000000,1) LIMIT 10;
# 加order by 走id主键索引,千万级0.001秒
EXPLAIN select * from goods g where g.id  > 8000000 ORDER BY g.id limit 10;
# 千万级耗时7.4秒
EXPLAIN SELECT * FROM goods g order by g.update_time ,g.id LIMIT 2000000,10;
# 千万级耗时0.04秒
EXPLAIN  select * from goods where id between 7000000 and 7000010 order by id desc
# 千万级耗时7.2秒
EXPLAIN SELECT g.update_time,g.id FROM goods g order by g.update_time ,g.id LIMIT 2000000,10;
# 用上了time索引,但是由于根据update_time有大量重复数据,不如id唯一性,导致>结果和上面不一致,千万级1秒
EXPLAIN SELECT * FROM goods g WHERE g.update_time >= (SELECT sg.update_time FROM goods sg ORDER BY sg.update_time LIMIT 2000000,1) LIMIT 10;
# 如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!
# 无索引,千万级2.7秒,有(name,id)索引0.8秒
EXPLAIN select g.id from goods g where g.`name`='商品1' limit 700000,10;

相关文章

  • 千万级表索引优化_2018-12-21

    创建货物品类表 创建货品表 填充货品类别 填充货品数据(1000万条) 将标的引擎修改为InnoDB(使用MyIS...

  • MySQL分库分表要点

    一、分库分表的原因 MySQL单机能力有限 百万级表可以通过主从、读写分离、优化索引等方式解决性能问题 千万级表时...

  • mysql查询效率优化之 索引配合LIMIT 来最大化提高查询

    举例说明百万级或千万级数据表 添加索引来优化查询效率 并 配合 LIMIT 最大化提高查询效率,此方法仅限于返回的...

  • MySQL千万级表优化

    一,数据库设计优化 1)表字段名取名是小且有意义 2)选择合适的字段类型,如性别可用enum 3)字段默认不...

  • 10 两表优化案例

    创建表 SQL语句 在左表建立索引 在右表建立索引,删掉左表索引 在右表建立索引,type变为ref,rows优化...

  • 数据库复习指南

    索引分析工具:explain 数据库优化。表很大之后,insert变得很慢,如何优化? 缓存; 分库分表; 索引;...

  • Mysql索引优化

    1、单表索引优化 单表索引优化分析 创建表 建表 SQL 表中的测试数据 查询案例 查询category_id为1...

  • 七、Mysql优化

    groupBy优化——filesort 联表优化——NLJ和BNL 索引查询优化——ICP

  • MySQL优化框架

    1,SQL语句优化 2,索引优化 3,数据库结构优化 4,InnoDB表优化 5,MyISAM表优化 6,Memo...

  • mysql-索引优化

    # 单表、两表、三表的优化案例 如何建立索引并优化 -在explain的基础上进行优化: ## 建表 create...

网友评论

      本文标题:千万级表索引优化_2018-12-21

      本文链接:https://www.haomeiwen.com/subject/hbguhqtx.html