mysql 之limit 的时候sending data 过长
2015-09-30 00:53
627 查看
这几天使用lucene在索引数据库记录,数据库里有1w左右的记录,其中最长的content字段,为text,当从数据库里通过分页查数据的时候使用一下语句
select * from article limit ?,?
当limit 3000,60 开始 数据基本要3s的样子,当到8000的时候,真的有蛮慢,有时候要37s,通过mysql的性能分析得知mysql的主要时间都花在sending data上了
超过3000就会这样,使用索引第一次也会这样,当加大缓存时候第二次使用相同的查询会很快,不过随便改个条件就又很慢了。
当换一个策略,select * from article where id > 3000 limit 1,60 又非常快,
如果这样
SELECT * from article t ORDER BY t.id LIMIT 7000,60
用explain是使用索引的,但从上面可以得出,这条语句只有在排序那使用索引,也就是说,查询实际上 还是全表扫描。
那这样,换一种方式:select t.id from article t.id limit 7000,60
然后 select t.* from article t where t.id in (...) 这些id中,然后用explain
1 SIMPLE
t const
PRIMARY PRIMARY4
const1
Primary说明使用了索引,这样就很快了
这里介绍一下mysql的profile性能分析
打开profile:
set profiling =1
可以查询最近执行的sql语句:
show profiles
根据queryid 查看具体的query
show profile for query 124
select * from article limit ?,?
当limit 3000,60 开始 数据基本要3s的样子,当到8000的时候,真的有蛮慢,有时候要37s,通过mysql的性能分析得知mysql的主要时间都花在sending data上了
超过3000就会这样,使用索引第一次也会这样,当加大缓存时候第二次使用相同的查询会很快,不过随便改个条件就又很慢了。
当换一个策略,select * from article where id > 3000 limit 1,60 又非常快,
如果这样
SELECT * from article t ORDER BY t.id LIMIT 7000,60
用explain是使用索引的,但从上面可以得出,这条语句只有在排序那使用索引,也就是说,查询实际上 还是全表扫描。
那这样,换一种方式:select t.id from article t.id limit 7000,60
然后 select t.* from article t where t.id in (...) 这些id中,然后用explain
1 SIMPLE
t const
PRIMARY PRIMARY4
const1
Primary说明使用了索引,这样就很快了
这里介绍一下mysql的profile性能分析
打开profile:
set profiling =1
可以查询最近执行的sql语句:
show profiles
根据queryid 查看具体的query
show profile for query 124
相关文章推荐
- 2.9-mysql主从配置-3
- 2.8-mysql主从配置-2
- 2.7-mysql主从配置-1
- HIve体系结构,hive的安装和mysql的安装,以及hive的一些简单使用
- 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失
- 在mysql中修改表名的sql语句
- mysql 不乱码五种方法
- 第1章 Mysql启动与关闭
- Mysql优化小结
- Can’t connect to Mysql server on ‘127.0.01’(10061)
- Embedded数据库比较:Access、SQLite、HSQLDB、Sybase、MySQL、DB4O
- MySQL Replication常见错误整理
- MySQL 调优基础(一) CPU与进程
- mysql中的运算符和函数
- 修改mysql数据库,表,字段 的字符集。
- mysql正则选取不包含中文的列
- MySQL权限管理
- Ubuntu 安装mysql和简单操作
- MYSQL 主从服务器配置工作原理
- mysql 清理分区表