有一文章表,字段有:id
,title
,content
等。 其中content
字段为text
类型,用于存放富文本。
在进行文章列表检索时: SELCT id, title FROM t1
SELECT 不加 content
字段会对查询速度有帮助吗(即:MYSQL 扫描行时会不会连带 content
字段一起读取了)?
考虑到富文本字段一般都好几兆,如果会一起读取,我得考虑把富文本单独放一张表,不然文章一多,读着太慢了。
结贴。 先说结论,会提升读取速度(不考虑网络传输,仅考虑磁盘IO),text、blob 超过页大小的行,会进行页外存储,产生一个20byte的指针。列是否存储在页外取决于页面大小和行的总大小。 当一行太长时,选择最长的列进行页外存储,直到聚集索引记录适合 B 树页面。 小于或等于 40 字节的 TEXT 和 BLOB 列存储在行中。
参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html#innodb-row-format-dynamic
![]() | 1 monetto 2021-07-15 16:01:02 +08:00 ![]() 个人理解,会的。 MySQL 底层簇族索引是把主键和数据列放在了一起。所以 CPU 其实影响不是很大。 但是富文本的话,恐怕会有一些 IO 压力。 |
![]() | 2 shakoon 2021-07-15 16:04:37 +08:00 有一定的帮助,但是有限。如果确实用不到的字段那是不应该加到 select 里。 |
![]() | 3 kiracyan 2021-07-15 16:06:03 +08:00 长文本最好单独放一个表 甚至存文件数据库 |
![]() | OP @shakoon 文章详情需要检索 content 。文章列表不用检索 content,我现在就怕 虽然 SELECT 没有 content,mysql 检索时会连 content 也读取了。 |
6 ChoateYao 2021-07-15 16:12:34 +08:00 会的,首先读取数据需要一定时间,其次传输数据也需要一定时间。 |
7 littlewing 2021-07-15 16:16:02 +08:00 ![]() innodb 对于超过 768 字节的 varchar text 会单独存储,读的时候可以不读 |
![]() | 8 fuxinya OP @littlewing 感谢。那就是说,超过 768 字节,只 SELECT id, title 时,mysql 不会读 content |
9 512357301 2021-07-17 17:45:18 +08:00 via Android 所以没啥是 mysql 文档解释不清的 |