drizzle-team / drizzle-team/drizzle-orm

[FEATURE]: Support customIndex for MySQL

Open
#3,789 4 comments 4 reactions 0 assignees View on GitHub
db/mysql drizzle/kit enhancement
Dominant language
TypeScript
Stars
35.8k
Forks
1.6k
Avg merge
2d 7h
Merged PRs (30d)
4

Description

### Feature hasn't been suggested before.

- [X] I have verified this feature I'm about to request hasn't been suggested before.

### Describe the enhancement you want to request

## Background

MySQL and MySQL ecosystem exists all kinds of `create index` scene‌s as below.

- create `normal` index:

```sql
CREATE INDEX idx_name on users(name) ;
CREATE INDEX idx_name on users(name) using hash;
CREATE UNIQUE INDEX idx_id on users(id);
```

- create `spatial` index:

```sql
CREATE SPATIAL INDEX idx_geom on users(geom);
```

- create `fulltext` index:

```sql
CREATE FULLTEXT INDEX idx_doc(doc) WITH PARSER NGRAM;
```

- create `vector` index for `MySQL`:

```sql
CREATE VECTOR INDEX idx_embedding ON users(embedding) SECONDARY_ENGINE_ATTRIBUTE=\'{"type":"spann", "distance":"cosine"}\';
```

- create `vector` index for [OceanBase](https://github.com/oceanbase/oceanbase) (a MySQL-like database but not 100% compatible):

```sql
CREATE VECTOR INDEX idx_embedding ON users(embedding) WITH (distance=L2, type=hnsw);
```
## Proposal

Current Dizzle `index` couldn't implement these demands. So I proposal to add `customIndex` API to define `raw` create index statement.

```ts
const users = mysqlTable(
"users",
{
id: bigint({ mode: "bigint" }).autoincrement().primaryKey(),
name: varchar({ length: 255 }).notNull(),
embedding: vector("embedding", { length: 3 }),
},
() => {
return {
idx_embedding: customIndex({
name: 'idx_embedding',
raw: 'CREATE VECTOR INDEX idx_embedding ON users(embedding) SECONDARY_ENGINE_ATTRIBUTE=\'{"type":"spann", "distance":"cosine"}\';',
}),
idx_fulltext: customIndex({
name: 'idx_fulltext',
raw: 'CREATE FULLTEXT INDEX idx_doc(doc) WITH PARSER NGRAM;',
}),
};
}
)
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.