MYSQL百万级数据查询优化

一、两种查询引擎查询速度

innoDB不保存表的具体行数,所以执行select count(*) from table; innoDB要扫描一遍整个表来计算行数,而MyISAM只需要简单的独处保存好的行数即可。

需要注意的是当 count(*)语句包含where条件时,两种表的操作有些不同,条件字段如果是主键之外其他具有唯一约束的列时,查询速度会快很多,可以避免全表扫描。
二、百万数据下mysql分页问题

– 在开发过程中我们进场使用分页,核心技术是使用limit进行数据的读取,

在mysql数据量大的情况下分页起点越大查询速度越慢。
select * from news order by id desc limit 0,10耗时0.003秒select * from news order by id desc limit 10000,10耗时0.058秒select * from news order by id desc limit 100000,10 耗时0.575秒select * from news order by id desc limit 1000000,10 耗时7.28秒
1
从上能看出100万条起查询速度已经需要七秒了。

改进:
select * from news where id >  (select id from news order by id desc  limit 1000000, 1)order by id desc limit 0,10
1
我们使用条件对id进行了筛选,在子查询中我们只查询了id这一个字段,相比多个字段节省了大量的时间开销。

改进:
select * from news where id  between 1000000 and 1000010 order by id desc
1
适合id连续的系统,速度极快

百万数据下mysql条件查询、分页查询的注意事项

加查询条件
select id from news where cate = 1order by id desc limit 500000 ,10 
1
用时20秒

优化:
select * from newswhere cate = 1 and id > (select id from news where cate = 1 order by id desc limit 500000,1 ) order by id desc limit 0,10 
1
用时15秒、效果并不明显

继续优化:建立索引表(myisam utf-8),只记录id等小内容字段信息,
select * from newswhere cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) order by id desc limit 0,10
1
用时1.23秒,查询速度大幅提升,

继续优化:将news2存储引擎变为innoDB。
select * from newswhere cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) order by id desc limit 0,10
1
只用了0.2秒,撒花!!!

MYSQL存储引擎 MyISAM和innoDB区别

注意mysql有多中存储引擎,MyISAM和innoDB只是其中常用的两种。
MyISAM存储引擎:

基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm 文件存放表格定义;数据文件是MYD (MYData);索引文件是MYI (MYIndex)。

InnoDB是事务型引擎:

支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如like操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

核心区别:
MyISAM是非事务安全型的,而InnoDB是事务安全型的。
MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
MyISAM支持全文类型索引,而InnoDB不支持全文索引。
MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
应用场景

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
课外知识:级联查询的情况下,避免使用大表作为驱动表(会增加查询循环的次数,inner join会自动选择小表作为驱动表)

你可能感兴趣的:(算法,数据库,性能优化)