mysql index analysis works

This commit is contained in:
Jan Prochazka
2021-08-19 16:08:27 +02:00
parent c5a3ee01ee
commit 89c904abc1
4 changed files with 30 additions and 2 deletions

View File

@@ -2,7 +2,7 @@ const engines = require('../engines');
const { testWrapper } = require('../tools');
const t1Sql = 'CREATE TABLE t1 (id int not null primary key, val1 varchar(50) null)';
const ix1Sql = 'CREATE index ix1 ON t1(val1)';
const ix1Sql = 'CREATE index ix1 ON t1(val1, id)';
const t2Sql = 'CREATE TABLE t2 (id int not null primary key, val2 varchar(50) null)';
const txMatch = (tname, vcolname, nextcol) =>
@@ -120,8 +120,9 @@ describe('Table analyse', () => {
const t1 = structure.tables.find(x => x.pureName == 't1');
expect(t1.indexes.length).toEqual(1);
expect(t1.indexes[0].columns.length).toEqual(1);
expect(t1.indexes[0].columns.length).toEqual(2);
expect(t1.indexes[0].columns[0]).toEqual(expect.objectContaining({ columnName: 'val1' }));
expect(t1.indexes[0].columns[1]).toEqual(expect.objectContaining({ columnName: 'id' }));
})
);
});

View File

@@ -74,6 +74,7 @@ class Analyser extends DatabaseAnalyser {
);
const viewTexts = await this.getViewTexts(views.rows.map(x => x.pureName));
const indexes = await this.driver.query(this.pool, this.createQuery('indexes', ['tables']));
return {
tables: tables.rows.map(table => ({
@@ -83,6 +84,19 @@ class Analyser extends DatabaseAnalyser {
columns: columns.rows.filter(col => col.pureName == table.pureName).map(getColumnInfo),
primaryKey: DatabaseAnalyser.extractPrimaryKeys(table, pkColumns.rows),
foreignKeys: DatabaseAnalyser.extractForeignKeys(table, fkColumns.rows),
uniques: [],
indexes: _.uniqBy(
indexes.rows.filter(idx => idx.tableName == table.pureName),
'constraintName'
).map(idx => ({
..._.pick(idx, ['constraintName', 'indexType']),
isUnique: !idx.nonUnique,
columns: indexes.rows
.filter(col => col.tableName == idx.tableName && col.constraintName == idx.constraintName)
.map(col => ({
..._.pick(col, ['columnName']),
})),
})),
})),
views: views.rows.map(view => ({
...view,

View File

@@ -4,6 +4,7 @@ const primaryKeys = require('./primaryKeys');
const foreignKeys = require('./foreignKeys');
const tableModifications = require('./tableModifications');
const views = require('./views');
const indexes = require('./indexes');
const programmables = require('./programmables');
const procedureModifications = require('./procedureModifications');
const functionModifications = require('./functionModifications');
@@ -18,4 +19,5 @@ module.exports = {
programmables,
procedureModifications,
functionModifications,
indexes,
};

View File

@@ -0,0 +1,11 @@
module.exports = `
SELECT
INDEX_NAME AS constraintName,
TABLE_NAME AS tableName,
COLUMN_NAME AS columnName,
INDEX_TYPE AS indexType,
NON_UNIQUE AS nonUnique
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = '#DATABASE#' AND TABLE_NAME =OBJECT_ID_CONDITION AND INDEX_NAME != 'PRIMARY' AND INDEX_NAME NOT LIKE 'IFK_%'
ORDER BY SEQ_IN_INDEX
`;