MySQL의 테이블 필드에 인덱스가 있는지 어떻게 확인합니까?


105

Google에 몇 번 필요했기 때문에 Q / A를 공유하고 있습니다.

답변:


139

다음 SHOW INDEX과 같이 사용하십시오 .

SHOW INDEX FROM [tablename]

문서 : https://dev.mysql.com/doc/refman/5.0/en/show-index.html


35
my_table어디에서 색인 표시 Key_name = 'index_to_check';
— mit

6
Key_name 대신 Column_name을 사용하는 것이 좋습니다. 이렇게하면 이름없이 자동으로 추가되는 경우 인덱스 이름을 찾을 필요가 없습니다.
— Programista

여러 키를 확인하는 방법은 무엇입니까?
— berserk

조심해서 이것을 사용하여 모든 진술을 테스트하십시오. LiquiBase 1.9.5와 함께 사용하려고 할 때 내 데이터베이스의 일부 테이블에서 실패합니다. 내 DB가 손상되었을 수 있습니다. 또는 직장에서 사용하고있는 LiquiBase의 고대 버전의 버그 일 수도 있습니다.
— Steve Gelman

36

시험:

SELECT * FROM information_schema.statistics 
  WHERE table_schema = [DATABASE NAME] 
    AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]

인덱스에 주어진 이름을 알 필요없이 특정 열에 어떤 종류의 인덱스가 있는지 알려줍니다. 또한 저장 프로 시저에서도 작동합니다 (인덱스 표시와 반대).


9
SHOW KEYS FROM  tablename WHERE Key_name='unique key name'

테이블에 고유 키가 있는지 확인할 수 있습니다.


8
show index from table_name where Column_name='column_name';

4

다음 문을 사용하십시오. SHOW INDEX FROM your_table

그런 다음 필드의 결과를 확인합니다. row [ "Table"], row [ "Key_name"]

"Key_name"을 올바르게 작성했는지 확인하십시오.


1

CLI에서 테이블 레이아웃을 살펴 보겠습니다. 당신은 할 것입니다

desc mytable

또는

테이블 mytable 표시


0

열에 대한 인덱스가 데이터베이스 함수로 존재하는 경우 (여기서는 처음부터 순서대로) 기능이 필요한 경우이 코드를 사용 / 채택 할 수 있습니다. 다중 열 인덱스의 위치에 관계없이 인덱스가 존재하는지 확인하려면 "AND SEQ_IN_INDEX = 1"부분을 삭제하면됩니다.

DELIMITER $$
CREATE FUNCTION `fct_check_if_index_for_column_exists_at_first_place`(
    `IN_SCHEMA` VARCHAR(255),
    `IN_TABLE` VARCHAR(255),
    `IN_COLUMN` VARCHAR(255)
)
RETURNS tinyint(4)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
BEGIN

-- Check if index exists at first place in sequence for a given column in a given table in a given schema. 
-- Returns -1 if schema does not exist. 
-- Returns -2 if table does not exist. 
-- Returns -3 if column does not exist. 
-- If the index exists in first place it returns 1, otherwise 0.
-- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');

-- check if schema exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.SCHEMATA
WHERE 
    SCHEMA_NAME = IN_SCHEMA
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -1;
END IF;


-- check if table exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -2;
END IF;


-- check if column exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
AND COLUMN_NAME = IN_COLUMN
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -3;
END IF;

-- check if index exists at first place in sequence
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    information_schema.statistics 
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
AND SEQ_IN_INDEX = 1;


IF @COUNT_EXISTS > 0 THEN
    RETURN 1;
ELSE
    RETURN 0;
END IF;


END$$
DELIMITER ;

-1

다음 SQL 문을 사용하여 테이블의 주어진 열이 인덱싱되었는지 여부를 확인할 수 있습니다.

select  a.table_schema, a.table_name, a.column_name, index_name
from    information_schema.columns a
join    information_schema.tables  b on a.table_schema  = b.table_schema and
                                    a.table_name = b.table_name and 
                                    b.table_type = 'BASE TABLE'
left join (
 select     concat(x.name, '/', y.name) full_path_schema, y.name index_name
 FROM   information_schema.INNODB_SYS_TABLES  as x
 JOIN   information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID
 WHERE  x.name = 'your_schema'
 and    y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema
where   a.table_schema = 'your_schema'
and     a.column_name  = 'your_column'
order by a.table_schema, a.table_name;

조인이 INNODB_SYS_ *에 대해 이루어 지므로 일치 인덱스는 INNODB 테이블에서만 제공됩니다.


-1

이것을 사용해보십시오 :

SELECT TRUE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "{DB_NAME}" 
AND TABLE_NAME = "{DB_TABLE}"
AND COLUMN_NAME = "{DB_INDEXED_FIELD}";

-3

인덱스가없는 경우 오류가 발생하므로 특정 show index 쿼리를 실행할 수 없습니다. 따라서 SQL 오류를 방지하려면 모든 인덱스를 배열로 가져 와서 반복해야합니다.

내가하는 방법은 다음과 같습니다. 테이블 (이 경우 leads) 에서 모든 인덱스를 가져온 다음 foreach 루프에서 열 이름 (이 경우 province) 이 있는지 여부를 확인합니다 .

$this->name = 'province';

$stm = $this->db->prepare('show index from `leads`');
$stm->execute();
$res = $stm->fetchAll();
$index_exists = false;

foreach ($res as $r) {
    if ($r['Column_name'] == $this->name) {
        $index_exists = true;
    }
}

이렇게하면 인덱스 속성을 실제로 좁힐 수 있습니다. DO가 print_r의를 $res함께 작업 할 수 있는지보기 위해.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.