【发布时间】:2017-12-08 05:49:25
【问题描述】:
我在我的一个应用程序中使用 MySql.Data.MySqlClient for C#。
在某个时刻,我的 .net 应用程序从一个大型 MySql 表中选择:
- 有两列,
- 一列是主键(PRI, int(11), auto increment)
- other column 是包含一些文本的列,(varchar(8000))
- 此列的一个示例条目是:
info1=a;info2=b;cIndex=1;info4=d;info5=0.33;
偶然地,这个非常大的表中包含文本段“'%cIndex=1;%'”的条目位于包含较大 cIndex 值(例如 34)的文本段的条目之前。
例如:
- column2 值为 "info1=a;info2=b;cIndex=1;info4=d;info5=0.33";是第 45566 个条目 在这个数据库上,
- 而 column2 值为 “info1=a;info2=b;cIndex=34;info4=d;info5=0.33;”是第 10,000,000 个 桌子上的条目。
- 所以基本上,具有较低 cIndex 值的条目在 from cIndex 值较高的条目。
此表与我早期应用程序的主要区别在于,我正在运行 sql 语句的表按照我的标准是“非常大”的;
- 有 2 列
- 还有 2460 万行。
- 以及我上面提到的数据结构。
我在应用程序中运行的 sql 语句示例如下:
SELECT column2 FROM myLargeTable WHERE (column2 LIKE
'%info3=1;%') AND (column2 LIKE '%cIndex=0;%');
而且,我在我的 c# 应用程序中为了运行此查询以获取结果的方法基本上如下:
public static string getInfoFromDb(string tbl, string col, string whr)
{
string myInfo = "error";
string sqlStr = "SELECT " + col + " from " + tbl + " " + whr + " " + " LIMIT 1 ";
MySqlConnection cn = new MySqlConnection(cstr);
cn.Open();
try
{
MySqlCommand co = new MySqlCommand(sqlStr, cn);
MySqlDataReader rd = co.ExecuteReader();
while (rd.Read()) { myInfo = rd.GetString(col); }
co.Dispose();
}
catch { /* do nothing */}
cn.Close();
return myInfo;
}
(因此,代码非常简单,并且多年来一直适用于我的数据库,其中表大小要小得多,大约为 70000+ 行)
我的问题是:
- 我的 sql 语句在运行时返回正确的结果 Toad-for-MySql 的编辑器页面,对于任何 cIndex 值 - 要么是 较小的值,例如 1,或较大的值,例如 34。在任何情况下, sql语句返回正确的结果。 1234563 column2 LIKE '%info3=1;%') AND (column2 LIKE '%cIndex=1;%') 返回正确的结果。
但是,有趣的是,这一次出乎意料的是,当从我的 C# 应用程序中运行相同的 sql 语句时,当 sql 语句中感兴趣的 cIndex 值为更大,例如 34。即 SELECT column2 FROM myLargeTable WHERE (column2 LIKE '%info3=1;%') AND (column2 LIKE '%cIndex=34;%')
非常感谢任何帮助。
提前感谢您的时间和考虑。
【问题讨论】:
-
顺便说一句,出于理智和性能的原因,也许是时候将单列中的多键值对设计分解为正确规范化的多值单值了-列设计。
-
你说得对,亚历克斯。正如您可能同意的那样,这种设计在开始时为我提供了巨大的灵活性来审查、重建和重建我的 c# 流程(无需审查和更改我的数据库设计)。但是现在,正如您所建议的,是时候将我的单行分隔结构分解为多列设计了。但是,我仍然很好奇为什么我上面介绍的方法不适用于这个大型数据库表,并且希望对未来的问题有一个体面的答案。非常感谢。