মাইএসকিউএলে কোনও টেবিল ক্ষেত্রে কোনও সূচক বিদ্যমান কিনা তা আমি কীভাবে পরীক্ষা করব?


105

আমি গুগল এটি কয়েকবার প্রয়োজন ছিল, তাই আমি আমার প্রশ্নোত্তর ভাগ করে নিচ্ছি।

উত্তর:


139

এর SHOW INDEXমতো ব্যবহার করুন :

SHOW INDEX FROM [tablename]

দস্তাবেজ: https://dev.mysql.com/doc/refman/5.0/en/show-index.html


35
my_tableযেখানেই কী_নাম = 'সূচি_পরে_চেক' থেকে সূচকগুলি দেখান ;
মিট

6
কী_নামের পরিবর্তে কলাম_নাম ব্যবহার করা ভাল, এইভাবে নাম বাদে স্বয়ংক্রিয়ভাবে যুক্ত হয়ে থাকলে সূচকের নামটি খুঁজে বের করার দরকার নেই।
প্রোগ্রামিস্ট

একাধিক কী কীভাবে চেক করবেন?
বের্সার্ক

সতর্কতা অবলম্বন করুন এবং এটি ব্যবহার করে সমস্ত বিবৃতি পরীক্ষা করুন। লিকুইবেস ১.৯.৫ দিয়ে এটি ব্যবহার করার চেষ্টা করার সময় এটি আমার ডাটাবেসে কিছু টেবিলগুলিতে ব্যর্থ হয়। হয়তো আমার ডিবি দূষিত। অথবা সম্ভবত এটি লিকুইবেসের প্রাচীন সংস্করণে একটি বাগ যা আমি কাজে ব্যবহার করে আটকেছি।
স্টিভ গেলম্যান

37

চেষ্টা করুন:

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'

টেবিলে কোনও অনন্য কী রয়েছে কিনা তা আপনি খুঁজে পেতে পারেন



4

নিম্নলিখিত বিবৃতিটি ব্যবহার করুন: আপনার_তালিকা থেকে সূচকগুলি দেখান

এবং তারপরে ক্ষেত্রগুলির জন্য ফলাফলটি পরীক্ষা করুন: সারি ["টেবিল"], সারি ["কী_নাম"]

আপনি "কী_নাম" সঠিকভাবে লিখেছেন তা নিশ্চিত করুন


1

ক্লায়েন্ট থেকে কেবল একটি টেবিলের বিন্যাসটি দেখতে। আপনি করতে হবে

desc mytable

অথবা

টেবিল mytable দেখান


0

ডাটাবেস ফাংশন হিসাবে যদি কোনও কলামের জন্য সূচক উপস্থিত থাকে (ক্রমানুসারে প্রথম স্থানে) আপনার কার্যকারিতাটির প্রয়োজন হয় তবে আপনি এই কোডটি ব্যবহার / গ্রহণ করতে পারবেন। আপনি যদি मल्टी-কলাম-ইনডেক্সে অবস্থান নির্বিশেষে কোনও সূচকটি উপস্থিত রয়েছে কিনা তা যদি জানতে চান তবে কেবল "এবং 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

আপনি নীচের এসকিউএল স্টেটমেন্টটি টেবিলের প্রদত্ত কলামটি সূচী করা হয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করতে পারেন

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

আপনি একটি নির্দিষ্ট শো সূচি ক্যোয়ারী চালাতে পারবেন না কারণ এটি যদি একটি সূচক উপস্থিত না থাকে তবে এটি ত্রুটি ছুঁড়ে দেবে। অতএব, আপনি যদি কোনও এসকিউএল ত্রুটি এড়াতে চান তবে আপনাকে সমস্ত সূচিগুলি একটি অ্যারেতে নিয়ে যেতে হবে এবং সেগুলির মধ্য দিয়ে লুপ করতে হবে।

আমি কিভাবে এটি হেরস। আমি টেবিল থেকে সমস্ত সূচকগুলি (এই ক্ষেত্রে, leads) ধরে ফেলছি এবং তারপরে, একটি পূর্বাঞ্চ লুপে, কলামের নামটি (এই ক্ষেত্রে 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.