当前位置:Gxlcms > 数据库问题 > MySQL 按日期分表

MySQL 按日期分表

时间:2021-07-01 10:21:17 帮助过:4人阅读

  之前做项目实在是太赶了,很多东西都没记录。是时候补回来了

  MySQL做一个大表,由于要存历史记录,所以数据量很大,查询很慢。恰好查询的时候,又不需要时间太久的冷数据。现在将其实现原理提取成一个控制台小程序。

  首先,创建一个简单的数据库访问类。

  1. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> CommonDao
  2. {
  3. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> MySqlConnection conn = <span style="color: #0000ff;">new</span> MySqlConnection(ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">DB</span><span style="color: #800000;">"</span>]); <span style="color: #008000;">//</span><span style="color: #008000;">创建连接</span>
  4. <span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
  5. <span style="color: #808080;">///</span><span style="color: #008000;"> Insert Update Delete语句的执行
  6. </span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
  7. <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="SQL"></span><span style="color: #008000;">SQL语句</span><span style="color: #808080;"></param></span>
  8. <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">返回影响行数</span><span style="color: #808080;"></returns></span>
  9. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> ExecuteNonQuerySQL(<span style="color: #0000ff;">string</span><span style="color: #000000;"> SQL)
  10. {
  11. MySqlCommand cmd </span>=<span style="color: #000000;"> conn.CreateCommand();
  12. cmd.CommandText </span>=<span style="color: #000000;"> SQL;
  13. </span><span style="color: #0000ff;">if</span> (conn.State !=<span style="color: #000000;"> ConnectionState.Open)
  14. {
  15. conn.Open();
  16. }
  17. </span><span style="color: #0000ff;">int</span> Count =<span style="color: #000000;"> cmd.ExecuteNonQuery();
  18. conn.Close();
  19. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Count;
  20. }
  21. }</span>

  由于是按分钟分表,所以写个定时器,每一分钟往里面插入5条数据:

  1. <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
  2. {
  3. </span><span style="color: #008000;">//</span><span style="color: #008000;">每分钟执行一次,插入5条数据</span>
  4. Timer t = <span style="color: #0000ff;">new</span> Timer(<span style="color: #800080;">60000</span><span style="color: #000000;">);
  5. t.Enabled </span>= <span style="color: #0000ff;">true</span>; <span style="color: #008000;">//</span><span style="color: #008000;">到达时间就执行一次,或者是持续执行</span>
  6. t.AutoReset = <span style="color: #0000ff;">true</span>; <span style="color: #008000;">//</span><span style="color: #008000;">一直执行</span>
  7. <span style="color: #000000;">
  8. t.Elapsed </span>+= (sender, eea) =><span style="color: #000000;">
  9. {
  10. </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < <span style="color: #800080;">5</span>; i++<span style="color: #000000;">)
  11. {
  12. DateTime dt </span>=<span style="color: #000000;"> DateTime.Now;
  13. </span><span style="color: #0000ff;">string</span> TableName = <span style="color: #800000;">"</span><span style="color: #800000;">person</span><span style="color: #800000;">"</span> + dt.ToString(<span style="color: #800000;">"</span><span style="color: #800000;">mm</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  14. </span><span style="color: #0000ff;">string</span> sql = <span style="color: #800000;">"</span><span style="color: #800000;">INSERT INTO </span><span style="color: #800000;">"</span> + TableName + <span style="color: #800000;">"</span><span style="color: #800000;"> VALUES(null,‘superman‘,‘</span><span style="color: #800000;">"</span> + dt.ToString(<span style="color: #800000;">"</span><span style="color: #800000;">yyyy-MM-dd HH:mm:ss</span><span style="color: #800000;">"</span>) + <span style="color: #800000;">"</span><span style="color: #800000;">‘)</span><span style="color: #800000;">"</span><span style="color: #000000;">;
  15. </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
  16. {
  17. CommonDao.ExecuteNonQuerySQL(sql);
  18. }
  19. </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e)
  20. {
  21. MySqlException ex </span>= e <span style="color: #0000ff;">as</span><span style="color: #000000;"> MySqlException;
  22. </span><span style="color: #008000;">//</span><span style="color: #008000;">1146的代号就是表不存在的错误</span>
  23. <span style="color: #0000ff;">if</span> (ex.Number == <span style="color: #800080;">1146</span><span style="color: #000000;">)
  24. {
  25. </span><span style="color: #008000;">//</span><span style="color: #008000;">如果表不存在,则先创建这个表</span>
  26. <span style="color: #0000ff;">string</span> SQLCreateTable = <span style="color: #800000;">"</span><span style="color: #800000;">CREATE TABLE </span><span style="color: #800000;">"</span> + TableName + <span style="color: #800000;">"</span><span style="color: #800000;"> LIKE person</span><span style="color: #800000;">"</span>; <span style="color: #008000;">//</span><span style="color: #008000;">从模板表来创建新表,这样的好处是索引、自增什么的可以一次性建好</span>
  27. <span style="color: #000000;"> CommonDao.ExecuteNonQuerySQL(SQLCreateTable);
  28. }
  29. }
  30. }
  31. };
  32. Console.ReadKey();
  33. }</span>

  第一张Person模板表的格式如下:

  1. <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> `person` (
  2. `Id` </span><span style="color: #0000ff;">int</span>(<span style="color: #800000; font-weight: bold;">11</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span><span style="color: #000000;"> AUTO_INCREMENT,
  3. `Name` </span><span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">255</span>) <span style="color: #0000ff;">DEFAULT</span> <span style="color: #0000ff;">NULL</span><span style="color: #000000;">,
  4. `OperateTime` </span><span style="color: #0000ff;">datetime</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #0000ff;">NULL</span><span style="color: #000000;">,
  5. </span><span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span><span style="color: #000000;"> (`Id`)
  6. ) ENGINE</span><span style="color: #808080;">=</span>InnoDB <span style="color: #0000ff;">DEFAULT</span> CHARSET<span style="color: #808080;">=</span>utf8;

  技术分享

 

  于是就每分钟都会创建表并添加数据。

  技术分享

二、分表后跨表查询的问题

  分表后有很多问题要处理,简单做两个,maybe会有其他问题。

  1、数据在哪个表里;

  2、数据跨表了,那么就需要表连接;

 

MySQL 按日期分表

标签:

人气教程排行