MySql中管理百万级要注意些什么东西

本文以MapXtreme为例,详细介绍了地图图片的切割算法过程。包括定义地图范围、设置地图视野、计算输出图片的地理长度,并通过循环输出不同视野下的地图图片。最后,通过MakePic函数实现地图的导出。

http://hi.baidu.com/leilumail/blog/item/4910f32a170d0a28d52af127.html

以MapXtreme为例说明图片切割算法:

1、定义地图范围、地图视野、输出图片大小。所要切割的地图范围。

   int x1 = int.Parse(txtX1.Text);     int x2 = int.Parse(txtX2.Text);     int y1 = int.Parse(txtY1.Text);     int y2 = int.Parse(txtY2.Text);

   double startzoom = System.Convert.ToDouble(txtStartZoom.Text);

   int mapWidth = int.Parse(txtWidth.Text);     int mapHeight = int.Parse(txtHeight.Text);

2、设置地图视野。

   map.Zoom = new MapInfo.Geometry.Distance(startzoom ,MapInfo.Geometry.DistanceUnit.Mile);

3、计算输出图片的边长对应的地理长度。

    MapInfo.Geometry.DRect rect = map.Bounds;      double dx = rect.x2 - rect.x1;      double dy = rect.y2 - rect.y1;

4、循环输出当前视野下的地图图片。

   MapInfo.Mapping.MapExport mapExport = new MapInfo.Mapping.MapExport(map); 

    double tmpy = y1;      int row = 0;      while (tmpy < y2)      {       row ++;       double tmpx = x1;       int col = 0;       while(tmpx < x2)       {        col ++;        rect = new MapInfo.Geometry.DRect(tmpx,tmpy,tmpx+dx,tmpy+dy);        map.SetView(rect,map.GetDisplayCoordSys());        MakePic(mapExport,row,col);        tmpx += dx;       }       tmpy += dy;      }

5、MakePic是地图输出函数。

   int mapWidth = int.Parse(txtWidth.Text);     int mapHeight = int.Parse(txtHeight.Text);     mapExport.ExportSize = new MapInfo.Mapping.ExportSize(mapWidth, mapHeight);     mapExport.Format = MapInfo.Mapping.ExportFormat.Png;     mapExport.Border = MapInfo.Mapping.ExportBorder.Off;     if(!System.IO.Directory.Exists(txtPicPath.Text + @"/map"))     {      System.IO.Directory.CreateDirectory(txtPicPath.Text + @"/map" );     }     string filename = txtPicPath.Text + @"/map/" + row.ToString() + "-" + col.ToString() + ".PNG";     mapExport.Export(filename);

`trx_id` 在 MySQL 中是 InnoDB 存储引擎用于标识一个事务(transaction)的唯一 ID。它是一个由 InnoDB 内部生成的 64 位整数,主要用于事务管理、并发控制和 MVCC(多版本并发控制)机制。 ### 1. `trx_id` 是什么? - **全称**:Transaction ID - **作用**:InnoDB 使用 `trx_id` 来唯一标识每一个执行中的事务。 - **生成时机**:每当一个事务开始时(尤其是第一个修改操作),InnoDB 会为该事务分配一个全局唯一的递增 `trx_id`。 - **查看方式**:可以通过以下命令查看当前系统中活跃事务的信息,包括 `trx_id`: ```sql -- 需要先启用性能模式或直接查询 information_schema SELECT * FROM information_schema.INNODB_TRX\G ``` 输出中会包含字段如: - `trx_id`:当前事务 ID - `trx_state`:事务状态(RUNNING, LOCK WAIT 等) - `trx_started`:事务开始时间 - `trx_mysql_thread_id`:对应的线程 ID --- ### 2. `trx_id` 的作用 #### (1)MVCC 实现 InnoDB 使用 MVCC 来实现非锁定读(即快照读)。每一行数据在更改时都会记录两个隐藏字段: - `DB_TRX_ID`:记录最后一次修改该行数据的事务 ID(也就是 `trx_id`) - `DB_ROLL_PTR`:指向回滚段中的 undo log 记录 当执行 `SELECT` 时,InnoDB 会根据当前事务的可见性视图(read view)判断某一行是否对当前事务可见。如果这一行的 `DB_TRX_ID > 当前事务的 trx_id` 或者该行被其他未提交事务修改,则可能不可见。 #### (2)事务隔离级别支持 例如在可重复读(REPEATABLE READ)下,MySQL 利用 `trx_id` 和 Read View 实现一致性读,保证同一个事务中多次读取结果一致。 #### (3)回滚与恢复 通过 `trx_id` 可以找到对应的 undo log,从而进行事务回滚或崩溃恢复。 --- ### 3. 注意事项 - **只读事务不会分配 `trx_id`** 如果事务只执行 `SELECT` 不做任何修改,InnoDB 不会立即分配 `trx_id`,直到发生写操作才会分配。 - **`trx_id` 是递增的** 每次分配都会递增,但由于是 64 位整数,几乎不会溢出。 - **无法手动设置 `trx_id`** 它是由 InnoDB 自动管理的内部机制,用户不能干预。 --- ### 示例:查看当前活跃事务 ```sql -- 查看当前所有 InnoDB 事务 SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query FROM information_schema.INNODB_TRX; ``` 这可以帮助你诊断死锁、长事务等问题。 --- ### 相关代码示例(Java 连接 MySQL 并观察事务行为) 虽然 `trx_id` 是数据库内部概念,但 Java 应用可通过 JDBC 控制事务并间接观察其影响: ```java import java.sql.*; public class TrxIdExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; try (Connection conn = DriverManager.getConnection(url, "root", "password")) { // 关闭自动提交,开启事务 conn.setAutoCommit(false); // 执行一个更新操作,触发 trx_id 分配 try (PreparedStatement ps = conn.prepareStatement("UPDATE users SET name = ? WHERE id = 1")) { ps.setString(1, "John"); ps.executeUpdate(); } // 查询当前事务 ID(通过 SQL) try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT trx_id FROM information_schema.INNODB_TRX WHERE trx_mysql_thread_id = CONNECTION_ID()")) { if (rs.next()) { String trxId = rs.getString("trx_id"); System.out.println("当前事务 ID: " + trxId); } } // 提交事务 conn.commit(); } catch (SQLException e) { e.printStackTrace(); } } } ``` > ⚠️ 注意:`information_schema.INNODB_TRX.trx_id` 是 InnoDB 内部使用的十六进制字符串表示,有时显示为大写字母形式(如 `1A8C5`),实际是 64 位整数的 HEX 形式。 --- ### 补充说明:`trx_id` 的生命周期 | 阶段 | 是否分配 `trx_id` | |------|------------------| | 开始事务(仅 SELECT) | 否 | | 第一次写操作(INSERT/UPDATE/DELETE) | 是(此时才分配) | | 提交或回滚后 | ID 不再活跃,但仍可能保留在历史记录中用于 MVCC | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值