drizzle-team / drizzle-team/drizzle-orm
[FEATURE]: Support customIndex for MySQL
- 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` scenes 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
Assessment
This issue has not been assessed yet.