Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql Tinytext vs Varchar vs Char_Php_Mysql_Sql_Database_Database Design - Fatal编程技术网

Php MySql Tinytext vs Varchar vs Char

Php MySql Tinytext vs Varchar vs Char,php,mysql,sql,database,database-design,Php,Mysql,Sql,Database,Database Design,建立一个系统,它有可能受到点击率和流量的沉重打击。 这是一个典型的Apache/PHP/MySql设置 我以前构建过很多系统,但从未有过这样一个场景:我真的必须就这种规模的潜在可伸缩性做出决定。关于构建这个magniture的系统,我有几十个问题,但是对于这个特定的问题,我正在尝试决定使用什么作为数据类型 这是100英尺的视图: 我们有一个表,其中(除其他外)有一个描述字段。我们决定将其限制在255个字符以内。它将是可搜索的(即:显示所有包含…)描述的条目。问题:此表可能在某个点上有数以百万计的

建立一个系统,它有可能受到点击率和流量的沉重打击。 这是一个典型的Apache/PHP/MySql设置

我以前构建过很多系统,但从未有过这样一个场景:我真的必须就这种规模的潜在可伸缩性做出决定。关于构建这个magniture的系统,我有几十个问题,但是对于这个特定的问题,我正在尝试决定使用什么作为数据类型

这是100英尺的视图:

我们有一个表,其中(除其他外)有一个描述字段。我们决定将其限制在255个字符以内。它将是可搜索的(即:显示所有包含…)描述的条目。问题:此表可能在某个点上有数以百万计的条目(或者我们认为是这样)

我还没有弄清楚搜索的策略(类似MySql的运营商可能会很慢,而且/或者我猜对于这么大的记录来说是一头猪),但这是另一个问题。对于这个问题,我想知道将这个字段创建为tinytext、varchar和char的利弊


我不是一个数据库专家,所以任何和所有的评论都是有帮助的。谢谢-

我相信使用varchar,您在实际数据库中的低级别存储了一个可变长度,这意味着它可以占用更少的磁盘空间,文本字段的长度是固定的,即使一行没有全部使用它。固定长度字符串的查询速度应该更快

编辑:我刚查过,文本类型也存储为可变长度。最好的办法是使用类似mysqlslap的东西对其进行基准测试


关于你的另一个未被问到的问题,你可能想要建立某种搜索索引,将描述字段中的每个有用的单词单独地与一个描述联系起来,然后你可以索引它并搜索它。将比使用%like%快得多

使用
CHAR

BLOB
TEXT
存储在行外,因此读取它们将受到访问惩罚。
VARCHAR
是可变长度的,这节省了存储空间,可能会引入较小的访问代价(因为行并非都是固定长度的)

但是,如果正确创建索引,则
VARCHAR
CHAR
可以完全存储在索引中,这将使访问速度大大加快

请参阅:
和:
和:
以及:


顺便说一句,根据我的经验,对于简单的查询(即,
selectid,其中一些列REGEX'search.*.
),MySQL操作符比
类似的
要快得多,而且显然更通用

在您的情况下,如果使用
LIKE
(像“%string%”这样的
将不会使用在该列上创建的任何索引,无论其类型如何),那么这三种类型都是不好的。其他一切都是噪音

我不知道
TINYTEXT
VARCHAR
之间有什么主要区别,最多255个字符,
CHAR
只是不适用于可变长度字符串


因此,我的建议是:选择
VARCHAR
TINYTEXT
(我个人会选择VARCHAR)并使用全文搜索引擎(如Lucene、Sphinx或任何其他为您做这项工作的搜索引擎)为该专栏的内容编制索引。忘记像
这样的
(即使这意味着您需要自己定制全文搜索索引引擎,不管您有什么原因,也就是说,您需要支持一组没有引擎能够满足的功能)。

如果您想在数百万行中搜索,请将所有这些文本存储在不同的表中(这将减少大表的行大小)如果文本数据较短,则使用
VARCHAR
,如果需要更大的长度,则使用text

使用专门的解决方案,如Lucene、Sphinx或Solr,而不是像
那样使用
进行搜索。我不记得是哪个解决方案,但至少其中一个可以轻松配置为实时或近实时索引

编辑


我的建议是将文本存储在不同的表中,这减少了主表所需的IO,但在插入数据时,需要保留额外的索引,并在selects中增加联接开销,因此,只有当您使用表一次读取一些描述,并且表中的其他数据被更频繁地使用时,这一建议才有效。

我正在签出并-se由于各种原因,ems-like varchar是最多255个字符的赢家。很好,看起来基准测试已经完成了,所以你可以开始了。谢谢。现在正在研究这些文章。投票结果为上。但还不确定要接受哪一个答案——还有很多要深入研究。一列最多
255
(意思是:可能大多数情况下,它大约是100个字符或更短)这应该不是问题,所以我认为将这些列存储在外部表中没有意义。这取决于您的数据大小-如果您的行中的数据较少,则可以更快地从磁盘读取数据,并更有效地使用缓存。在表扫描期间,100万行中减少100字节的读取量将减少100 MB=~6400页(假设标准InnoDB每页16 KB).这是一个廉价的优化,将来可能会有回报。因此,让我们为每一个长度超过50字节的
varchar
列构建一个表?我看到的问题是:在性能危急的情况下,为什么您会接受并对完整表扫描无所作为?我不努力使完整表扫描更快,我努力避免陷入这种情况这里需要进行完整的表格扫描。显然,这不可能在任何时候都进行,但在我的书中,这是必须的。表格扫描无论如何都不是一个好办法。我使用表格扫描只是作为一个例子,我可以很容易地计算优势。@Mariusz-不是每一个
varchar
,但如果表格要有数百万个条目,那么就这样吧