Skip to content

Commit b22229f

Browse files
Force index in unique key range queries (#1237)
* WIP * Pass entire sql.UniqueKey * newline for limit * Rename var --------- Co-authored-by: meiji163 <[email protected]>
1 parent fa12f44 commit b22229f

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

go/logic/applier.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ func (this *Applier) ExecuteThrottleQuery() (int64, error) {
471471
// readMigrationMinValues returns the minimum values to be iterated on rowcopy
472472
func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *sql.UniqueKey) error {
473473
this.migrationContext.Log.Debugf("Reading migration range according to key: %s", uniqueKey.Name)
474-
query, err := sql.BuildUniqueKeyMinValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, &uniqueKey.Columns)
474+
query, err := sql.BuildUniqueKeyMinValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, uniqueKey)
475475
if err != nil {
476476
return err
477477
}
@@ -496,7 +496,7 @@ func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *sql.UniqueK
496496
// readMigrationMaxValues returns the maximum values to be iterated on rowcopy
497497
func (this *Applier) readMigrationMaxValues(tx *gosql.Tx, uniqueKey *sql.UniqueKey) error {
498498
this.migrationContext.Log.Debugf("Reading migration range according to key: %s", uniqueKey.Name)
499-
query, err := sql.BuildUniqueKeyMaxValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, &uniqueKey.Columns)
499+
query, err := sql.BuildUniqueKeyMaxValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, uniqueKey)
500500
if err != nil {
501501
return err
502502
}

go/sql/builder.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -352,24 +352,24 @@ func BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, tableName str
352352
return result, explodedArgs, nil
353353
}
354354

355-
func BuildUniqueKeyMinValuesPreparedQuery(databaseName, tableName string, uniqueKeyColumns *ColumnList) (string, error) {
356-
return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKeyColumns, "asc")
355+
func BuildUniqueKeyMinValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey) (string, error) {
356+
return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKey, "asc")
357357
}
358358

359-
func BuildUniqueKeyMaxValuesPreparedQuery(databaseName, tableName string, uniqueKeyColumns *ColumnList) (string, error) {
360-
return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKeyColumns, "desc")
359+
func BuildUniqueKeyMaxValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey) (string, error) {
360+
return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKey, "desc")
361361
}
362362

363-
func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uniqueKeyColumns *ColumnList, order string) (string, error) {
364-
if uniqueKeyColumns.Len() == 0 {
363+
func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey, order string) (string, error) {
364+
if uniqueKey.Columns.Len() == 0 {
365365
return "", fmt.Errorf("Got 0 columns in BuildUniqueKeyMinMaxValuesPreparedQuery")
366366
}
367367
databaseName = EscapeName(databaseName)
368368
tableName = EscapeName(tableName)
369369

370-
uniqueKeyColumnNames := duplicateNames(uniqueKeyColumns.Names())
370+
uniqueKeyColumnNames := duplicateNames(uniqueKey.Columns.Names())
371371
uniqueKeyColumnOrder := make([]string, len(uniqueKeyColumnNames))
372-
for i, column := range uniqueKeyColumns.Columns() {
372+
for i, column := range uniqueKey.Columns.Columns() {
373373
uniqueKeyColumnNames[i] = EscapeName(uniqueKeyColumnNames[i])
374374
if column.Type == EnumColumnType {
375375
uniqueKeyColumnOrder[i] = fmt.Sprintf("concat(%s) %s", uniqueKeyColumnNames[i], order)
@@ -378,14 +378,15 @@ func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uni
378378
}
379379
}
380380
query := fmt.Sprintf(`
381-
select /* gh-ost %s.%s */ %s
382-
from
383-
%s.%s
384-
order by
385-
%s
386-
limit 1
387-
`, databaseName, tableName, strings.Join(uniqueKeyColumnNames, ", "),
388-
databaseName, tableName,
381+
select /* gh-ost %s.%s */ %s
382+
from
383+
%s.%s
384+
force index (%s)
385+
order by %s
386+
limit 1
387+
`,
388+
databaseName, tableName, strings.Join(uniqueKeyColumnNames, ", "),
389+
databaseName, tableName, uniqueKey.Name,
389390
strings.Join(uniqueKeyColumnOrder, ", "),
390391
)
391392
return query, nil

go/sql/builder_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2016 GitHub Inc.
2+
Copyright 2022 GitHub Inc.
33
See https://github.com/github/gh-ost/blob/master/LICENSE
44
*/
55

@@ -310,26 +310,29 @@ func TestBuildUniqueKeyMinValuesPreparedQuery(t *testing.T) {
310310
databaseName := "mydb"
311311
originalTableName := "tbl"
312312
uniqueKeyColumns := NewColumnList([]string{"name", "position"})
313+
uniqueKey := &UniqueKey{Name: "PRIMARY", Columns: *uniqueKeyColumns}
313314
{
314-
query, err := BuildUniqueKeyMinValuesPreparedQuery(databaseName, originalTableName, uniqueKeyColumns)
315+
query, err := BuildUniqueKeyMinValuesPreparedQuery(databaseName, originalTableName, uniqueKey)
315316
test.S(t).ExpectNil(err)
316317
expected := `
317318
select /* gh-ost mydb.tbl */ name, position
318319
from
319320
mydb.tbl
321+
force index (PRIMARY)
320322
order by
321323
name asc, position asc
322324
limit 1
323325
`
324326
test.S(t).ExpectEquals(normalizeQuery(query), normalizeQuery(expected))
325327
}
326328
{
327-
query, err := BuildUniqueKeyMaxValuesPreparedQuery(databaseName, originalTableName, uniqueKeyColumns)
329+
query, err := BuildUniqueKeyMaxValuesPreparedQuery(databaseName, originalTableName, uniqueKey)
328330
test.S(t).ExpectNil(err)
329331
expected := `
330332
select /* gh-ost mydb.tbl */ name, position
331333
from
332334
mydb.tbl
335+
force index (PRIMARY)
333336
order by
334337
name desc, position desc
335338
limit 1

0 commit comments

Comments
 (0)