有一文章表,字段有: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 1
个人理解,会的。
MySQL 底层簇族索引是把主键和数据列放在了一起。所以 CPU 其实影响不是很大。 但是富文本的话,恐怕会有一些 IO 压力。 |
2
shakoon 2021-07-15 16:04:37 +08:00
有一定的帮助,但是有限。如果确实用不到的字段那是不应该加到 select 里。
|
3
kiracyan 2021-07-15 16:06:03 +08:00
长文本最好单独放一个表 甚至存文件数据库
|
4
fuxinya 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 2
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 文档解释不清的😂
|