ฉันจะตรวจสอบได้อย่างไรว่ามีดัชนีอยู่ในช่องตารางใน MySQL


106

ฉันต้องการ Google สองสามครั้งดังนั้นฉันจึงแบ่งปันคำถาม / คำตอบของฉัน

คำตอบ:


140

ใช้SHOW INDEXดังนี้:

SHOW INDEX FROM [tablename]

เอกสาร: https://dev.mysql.com/doc/refman/5.0/en/show-index.html


35
แสดงดัชนีจากที่ที่my_tableKey_name = 'index_to_check';
mit

6
ใช้ Column_name แทน Key_name ได้ดีกว่าด้วยวิธีนี้คุณไม่จำเป็นต้องค้นหาชื่อดัชนีหากมีการเพิ่มโดยอัตโนมัติโดยไม่มีชื่อ
Programista

จะตรวจสอบหลายคีย์ได้อย่างไร?
berserk

ระมัดระวังและทดสอบข้อความทั้งหมดโดยใช้สิ่งนี้ สิ่งนี้ล้มเหลวในบางตารางในฐานข้อมูลของฉันเมื่อพยายามใช้กับ LiquiBase 1.9.5 บางทีฐานข้อมูลของฉันอาจเสียหาย หรืออาจจะเป็นข้อผิดพลาดใน LiquiBase เวอร์ชันโบราณที่ฉันติดอยู่ในที่ทำงาน
Steve Gelman

37

ลอง:

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

จะบอกคุณว่ามีดัชนีชนิดใดในคอลัมน์ใดคอลัมน์หนึ่งโดยไม่จำเป็นต้องทราบชื่อที่กำหนดให้กับดัชนี นอกจากนี้ยังทำงานในขั้นตอนการจัดเก็บ (ซึ่งตรงข้ามกับการแสดงดัชนี)




4

ใช้ข้อความต่อไปนี้: SHOW INDEX FROM your_table

จากนั้นตรวจสอบผลลัพธ์สำหรับฟิลด์: row ["Table"], row ["Key_name"]

ตรวจสอบว่าคุณเขียน "Key_name" อย่างถูกต้อง


1

เพื่อดูเค้าโครงตารางจาก cli คุณจะทำ

desc mytable

หรือ

แสดงตาราง mytable


0

คุณสามารถใช้คำสั่ง 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 เท่านั้น


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 ;

0

ลองใช้สิ่งนี้:

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

คุณไม่สามารถเรียกใช้แบบสอบถามดัชนีการแสดงเฉพาะได้เนื่องจากจะทำให้เกิดข้อผิดพลาดหากไม่มีดัชนี ดังนั้นคุณต้องจับดัชนีทั้งหมดในอาร์เรย์และวนซ้ำหากคุณต้องการหลีกเลี่ยงข้อผิดพลาดของ SQL

นี่เป็นวิธีที่ฉันทำ ฉันจับดัชนีทั้งหมดจากตาราง (ในกรณีนี้leads) จากนั้นใน foreach loop ให้ตรวจสอบว่าชื่อคอลัมน์ (ในกรณีนี้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;
    }
}

ด้วยวิธีนี้คุณสามารถ จำกัด แอตทริบิวต์ดัชนีให้แคบลงได้ ทำprint_rของ$resเพื่อที่จะดูว่าคุณสามารถทำงานร่วมกับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.