gpt4 book ai didi

MySQL CONCAT '*' 符号向数据库 toast

转载 作者:可可西里 更新时间:2023-11-01 08:35:43 26 4
gpt4 key购买 nike

我有一个用于查找的表,它在一列中存储人类可读的值,在另一列中存储去除特殊字符和空格的相同文本。例如,值“Children's Shows”将在查找列中显示为“childrens-shows”。

不幸的是,相应的主表并不是那么简单 - 由于历史原因,我没有自己创建,现在很难撤消,查找值实际上存储在周围的星号中,例如'* child 节目*'。

因此,在尝试将无星号查找表与带星号的主表连接时,我认为 CONCAT 会帮助我即时添加它们,例如;

    SELECT * 
FROM main_table m
INNER JOIN lookup_table l
ON l.value = CONCAT('*',m.value,'*')

... 然后 table 就烤好了。不确定我是创建了一个无限循环还是真的搞砸了数据,但它需要 ISP 备份才能让表再次响应。我怀疑这是因为“*”符号可能是保留的,就像通配符一样,我已经要求数据库做相当于舔自己肘部的事情。无论哪种方式,鉴于它设法杀死数据库的壮观方式,我都不愿“试验”以找到答案。

提前感谢任何可以 (a) 告诉我上面对数据库实际做了什么,以及 (b) 我应该如何实际加入表的人?

最佳答案

当使用CONCAT时,mysql不会使用索引。使用 EXPLAIN 来检查这个,但我最近遇到的一个问题是在一个大表上,索引列在那里,但没有使用键。然而,这不应该让整个表格变得乏味,只是让它变慢。可能它用完了内存,开始交换然后中途崩溃,但您需要检查日志才能找出答案。

然而,根本原因显然是糟糕的表设计,而这正是解决方案所在。您得到的任何允许您解决此问题的答案最多只能是暂时的。

最好的解决方案是将这些数据移到一个单独的表中。 “ child 节目”听起来像一个类别,因此在许多行中重复数据。这实际上应该是“类别”表的 id,这将防止数据库必须在表中的每一行上运行 CONCAT,因为您可以这样做:

    SELECT * 
FROM main_table m
INNER JOIN lookup_table l
ON l.value = m.value
/* and optionally */
INNER JOIN categories cat
ON l.value = cat.id
WHERE cat.name = 'whatever'

我知道根据您在问题中提供的信息,您可能无法做到这一点,但实际上无法对规范化程度很差的数据库进行此类更改的原因比此处的代码更重要。如果没有资源或政治支持来以正确的方式做事,你最终会遇到更多像这样令人头疼的事情,从长远来看,最终会付出更多代价。也许是时候和老板谈谈了:)

关于MySQL CONCAT '*' 符号向数据库 toast ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12931771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com