mysql longtext 查询_mysql中longtext存在大量数据时,会导致查询很慢?
大家好,又见面了,我是你们的朋友全栈君。
一个表,1.5w条数据,字段: id,name,content,last_update_time
id,自定义主键
name,varchar类型
content是longtext类型,
last_update_time为datetime类型,不为空
content当中是文本和代码等,平均长度在20k+。
case1:
select id, name from t order by last_update_time limit 10000, 10
当content当中有大量的文本时,case1的效率极慢。
及时给 last_update_time 加上btree索引, 效率有提升,但是依然慢
把content一列删掉,效率很高。毫秒级别。
使用explain:
有content时结果:
mysql> explain select id, name, last_update_time from t order by last_update_time desc limit 11120, 11;
+—-+————-+———–+——-+—————+———————-+———+——+——-+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———–+——-+—————+———————-+———+——+——-+——-+
| 1 | SIMPLE | t | index | NULL | idx_last_update_time | 8 | NULL | 11131 | NULL |
+—-+————-+———–+——-+—————+———————-+———+——+——-+——-+
无content列的结果:
+—-+————-+—————-+——+—————+——+———+——+——-+—————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+—————-+——+—————+——+———+——+——-+—————-+
| 1 | SIMPLE | t2 | ALL | NULL | NULL | NULL | NULL | 15544 | Using filesort |
+—-+————-+—————-+——+—————+——+———+——+——-+—————-+
1 row in set (0.00 sec)
请大神请教,是什么问题?该怎么优化?
无content的时候,查询走的是idx_last_update_time,我猜测这个索引中包含了id,name字段,因此仅通过索引就可以获取到所需的数据,因此速度很快。
有content的时候,因为有limit 10000的语句,且无法从索引中获取content字段的内容,因此采用的全表扫描的方法。
建议改写sql语句,让数据库的执行计划更充分使用索引,假设id是主键:
select id, name, content
from t
where id in (
select id
from t
order by last_update_time limit 10000, 10
)
content当中是文本和代码等,平均长度在20k+。
这种应该建立全文索引(FUNLLTEXT INDEX)吧。简单的索引不适合这种超长文本的字段。
我觉得,主要跟你的分页查询的方式有关,limit 10000,10 这个意思是扫描满足条件的10010条数据,扔掉前面的10000行,返回最后的10行,在加上你的表中有个,非常大的字段,这样必然增加数据库查询的i/o时间,
查询优化你可以参照 @邢爱明 的
SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY last_update_time limit 10000, 10);
还有一种优化方式:你可以记录最后的last_update_time 每次最后的值。然后查询可以这样写:
SELECT * FROM items WHERE last_update_time > “最后记录的值” order by last_update_time limit 0,10;
这两种方式你可以执行看看那个效率高,希望对你有帮助。。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146534.html原文链接:https://javaforall.cn
相关文章
- 深入浅出MySQL索引分类(mysql索引分类)
- MySQL支持JSON格式:优势何在?(mysql的json格式)
- MySQL查询:如何查询指定年龄的人?(mysql查询年龄)
- 交叉表分析MySQL数据挖掘初体验(交叉表mysql)
- MySQL数据库技术:让数据更加智能(数据库技术mysql)
- MySQL内存占用问题:如何优化解决(mysql内存占用过高)
- 数据从MySQL访问数据:构建数据抓取系统(c读取mysql)
- 服务运用命令行开启MySQL服务(命令行开启mysql)
- MySQL单表查询优化:解决慢查询问题(mysql单表查询慢)
- Yum安装MySQL极速升级(yum升级mysql)
- 据库快速掌握MySQL查询连接数据库技巧(mysql查询连接数)
- MySQL索引最大长度:768字节限制(mysql索引最大长度)
- MySQL中的索引树:简洁又机智的数据操纵(mysql索引树)
- 解密MySQL期末考试题:掌握数据库管理的精髓!(mysql期末考试题)
- 如何使用Hive将数据从MySQL导入?(hive导入mysql)
- MySQL表:添加新数据记录(mysql 表中插入数据)
- 查看MySQL数据库:一步步操作指南(查看mysql 数据库名)
- MySQL操作用C编写SQL语句的基本方法(c mysql写语句)
- MySQL联表分组查询(mysql两表联查分组)
- 深入探究MySQL中关联字段及其使用方法(mysql中关联字段)
- MySQL中光标的应用简介(mysql中光标的应用)
- MySQL三张百万表数据管理技巧(mysql三张百万)
- 如何设置MySQL实现一行显示查询结果(mysql 一行显示)
- MySQL 基础掌握 PIN 码的生成和使用技巧(mysql_pin)
- MySQL Workbench使用Yog备份数据简单易学,备份轻松(mysql yog备份)
- MySQL如何修改表列名(mysql x修改表列名)
- 使用MySQL将XML数据存储起来,轻松高效地管理和访问(mysql xml 存储)
- MySQL查询语句中如何进行上升排序(mysql上升排序)