motedb 0.1.4

AI-native embedded multimodal database for embodied intelligence (robots, AR glasses, industrial arms).
Documentation
# 快速开始

5 分钟快速上手 MoteDB,了解核心功能和使用方法。

## 安装

在 `Cargo.toml` 中添加依赖:

```toml
[dependencies]
motedb = "0.1"
```

## 基础用法

### 1. 创建数据库

```rust
use motedb::{Database, Result};

fn main() -> Result<()> {
    // 创建或打开数据库
    let db = Database::open("myapp.mote")?;
    
    Ok(())
}
```

### 2. 创建表

```rust
// 创建用户表
db.execute("CREATE TABLE users (
    id INT,
    name TEXT,
    email TEXT,
    age INT
)")?;

// 创建文档表(包含向量字段)
db.execute("CREATE TABLE documents (
    id INT,
    title TEXT,
    content TEXT,
    embedding VECTOR(128)
)")?;
```

### 3. 插入数据

#### 方式 1: SQL 插入(推荐)

```rust
// 单行插入
db.execute("INSERT INTO users VALUES (1, 'Alice', 'alice@example.com', 25)")?;

// 批量插入(SQL)
db.execute("INSERT INTO users VALUES 
    (2, 'Bob', 'bob@example.com', 30),
    (3, 'Carol', 'carol@example.com', 28)")?;
```

#### 方式 2: API 批量插入(高性能)

```rust
use motedb::types::{Value, SqlRow};
use std::collections::HashMap;

// 批量插入(比 SQL 快 10-20 倍)
let mut rows = Vec::new();
for i in 0..1000 {
    let mut row = HashMap::new();
    row.insert("id".to_string(), Value::Integer(i));
    row.insert("name".to_string(), Value::Text(format!("User{}", i)));
    row.insert("email".to_string(), Value::Text(format!("user{}@example.com", i)));
    row.insert("age".to_string(), Value::Integer(20 + (i % 40)));
    rows.push(row);
}

let row_ids = db.batch_insert_map("users", rows)?;
println!("Inserted {} rows", row_ids.len());
```

### 4. 查询数据

```rust
// 简单查询
let results = db.query("SELECT * FROM users WHERE age > 25")?;
println!("Found {} users", results.row_count());

// 遍历结果
for row_map in results.rows_as_maps() {
    if let Some(name) = row_map.get("name") {
        println!("Name: {:?}", name);
    }
}

// 聚合查询
let avg_result = db.query("SELECT AVG(age) as avg_age FROM users")?;
```

### 5. 更新和删除

```rust
// 更新数据
db.execute("UPDATE users SET age = 26 WHERE name = 'Alice'")?;

// 删除数据
db.execute("DELETE FROM users WHERE age < 20")?;
```

## 创建索引

索引可以大幅提升查询性能。

### 列索引(等值/范围查询)

```rust
// 创建列索引(性能提升 40 倍)
db.execute("CREATE INDEX users_email ON users(email)")?;

// 查询会自动使用索引
let results = db.query("SELECT * FROM users WHERE email = 'alice@example.com'")?;
```

### 向量索引(相似度搜索)

```rust
// 创建向量索引
db.execute("CREATE VECTOR INDEX docs_embedding ON documents(embedding)")?;

// 向量 KNN 搜索
let query = "SELECT * FROM documents 
             ORDER BY embedding <-> [0.1, 0.2, ..., 0.5] 
             LIMIT 10";
let results = db.query(query)?;
```

### 全文索引(文本搜索)

```rust
// 创建全文索引
db.execute("CREATE TEXT INDEX articles_content ON articles(content)")?;

// BM25 全文搜索
let results = db.query(
    "SELECT * FROM articles WHERE MATCH(content, 'rust database')"
)?;
```

## 事务支持

```rust
// 开始事务
let tx_id = db.begin_transaction()?;

db.execute("INSERT INTO users VALUES (100, 'Dave', 'dave@example.com', 35)")?;
db.execute("INSERT INTO users VALUES (101, 'Eve', 'eve@example.com', 32)")?;

// 提交事务
db.commit_transaction(tx_id)?;

// 或者回滚
// db.rollback_transaction(tx_id)?;
```

### Savepoint(事务内检查点)

```rust
let tx_id = db.begin_transaction()?;

db.execute("INSERT INTO users VALUES (200, 'Frank', 'frank@example.com', 40)")?;
db.savepoint(tx_id, "sp1")?;

db.execute("INSERT INTO users VALUES (201, 'Grace', 'grace@example.com', 38)")?;
db.rollback_to_savepoint(tx_id, "sp1")?; // 只回滚 Grace

db.commit_transaction(tx_id)?; // Frank 会被保留
```

## 持久化

```rust
// 手动刷新到磁盘
db.flush()?;

// 关闭数据库(自动刷新)
db.close()?;
```

## 完整示例

```rust
use motedb::{Database, Result};
use motedb::types::{Value, SqlRow};
use std::collections::HashMap;

fn main() -> Result<()> {
    // 1. 打开数据库
    let db = Database::open("demo.mote")?;
    
    // 2. 创建表
    db.execute("CREATE TABLE products (
        id INT,
        name TEXT,
        price FLOAT,
        category TEXT
    )")?;
    
    // 3. 批量插入数据
    let mut rows = Vec::new();
    for i in 0..100 {
        let mut row = HashMap::new();
        row.insert("id".to_string(), Value::Integer(i));
        row.insert("name".to_string(), Value::Text(format!("Product{}", i)));
        row.insert("price".to_string(), Value::Float((i as f64) * 9.99));
        row.insert("category".to_string(), Value::Text(
            if i % 2 == 0 { "Electronics" } else { "Books" }.to_string()
        ));
        rows.push(row);
    }
    db.batch_insert_map("products", rows)?;
    
    // 4. 创建索引
    db.execute("CREATE INDEX products_category ON products(category)")?;
    
    // 5. 查询数据
    let results = db.query("SELECT * FROM products WHERE category = 'Electronics' AND price < 200")?;
    println!("Found {} products", results.row_count());
    
    // 6. 聚合查询
    let avg_result = db.query("SELECT category, AVG(price) as avg_price FROM products GROUP BY category")?;
    for row_map in avg_result.rows_as_maps() {
        println!("Category: {:?}, Avg Price: {:?}", 
            row_map.get("category"), 
            row_map.get("avg_price"));
    }
    
    // 7. 持久化
    db.flush()?;
    
    Ok(())
}
```

## 性能提示

1. **批量操作优先**: 使用 `batch_insert_map()` 而非逐行插入(快 10-20 倍)
2. **合理使用索引**: 对频繁查询的列创建索引(性能提升 40 倍)
3. **使用事务**: 多个操作放在一个事务中提高性能
4. **定期 flush**: 确保数据持久化

## 下一步

- [SQL 操作详解]./03-sql-operations.md - 学习完整 SQL 语法
- [批量操作指南]./04-batch-operations.md - 高性能批量插入技巧
- [索引系统]./06-indexes-overview.md - 深入了解五大索引类型
- [API 参考]./14-api-reference.md - 完整 API 文档

## 常见问题

**Q: 如何选择使用 SQL 还是 API?**  
A: 优先使用 SQL API,除非需要极致性能的批量插入,才使用 `batch_insert_map()`。

**Q: 索引什么时候创建?**  
A: 数据插入后创建索引,或者插入前创建(会自动增量更新)。

**Q: 如何保证数据不丢失?**  
A: 使用事务 + 定期 `flush()`,或在关键操作后调用 `flush()`。

---

**上一篇**: [安装配置](./02-installation.md)  
**下一篇**: [SQL 操作](./03-sql-operations.md)