Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL अद्यतन:टी-एसक्यूएल डेवलपर्स के लिए शीर्ष 5 युक्तियाँ

क्या आप अपने डेटाबेस स्किलसेट की सूची में MySQL जोड़ रहे हैं? फिर MySQL UPDATE स्टेटमेंट एक कमांड है जिसे आपको सीखने की जरूरत है।

हम SQL सर्वर के दृष्टिकोण से MySQL की अपनी यात्रा जारी रख रहे हैं। इसकी शुरुआत CREATE TABLE से हुई, उसके बाद INSERT, और सबसे हालिया टुकड़ा DELETE के बारे में था। आज, UPDATE हमारा केंद्र बिंदु है।

अंतर सूक्ष्म और सीखने में आसान हैं। लेकिन पिछले लेखों की तरह ही, हमारा लक्ष्य आपको जल्दी से आगे बढ़ाना है। लेकिन इससे पहले कि हम आगे बढ़ें, इन बातों को स्पष्ट कर दें:

  • यहां इस्तेमाल किए गए उदाहरण MySQL 8.0.23 पर InnoDB स्टोरेज इंजन का उपयोग करके चलाए गए थे।
  • हमने SQL सर्वर 2019 का उपयोग किया है।

नमूना डेटा तैयार करें

हम नमूना डेटा के बिना आगे नहीं बढ़ सकते। मैं इस अभ्यास में टी-एसक्यूएल डेवलपर्स को घर पर रखना चाहता हूं। तो, आइए कुछ परिचित तालिकाओं को AdventureWorks . में आयात करें SQL सर्वर से नमूना डेटाबेस:

  • उत्पाद
  • SalesOrderHeader
  • बिक्री आदेश विवरण

इन तालिकाओं को MySQL में आयात करने के लिए, मैंने MySQL के लिए dbForge Studio का उपयोग किया। ये चरण हैं:

  1. एक नया डेटाबेस बनाएं जिसका नाम है Adventureworks2019
  2. राइट-क्लिक करें एडवेंचरवर्क्स2019 और टूल . चुनें ।
  3. डेटा आयात करें का चयन करें . एक नई विंडो दिखाई देगी।
  4. ओडीबीसी का चयन करें . आपको एक उपयोगकर्ता DSN create बनाना होगा अपने SQL सर्वर और AdventureWorks . से कनेक्ट करने के लिए डेटाबेस।
  5. अगला क्लिक करें ।
  6. वह तालिका चुनें जिसे आपको आयात करने की आवश्यकता है, MySQL कनेक्शन और लक्ष्य डेटाबेस (adventureworks2019 )।
  7. अगला क्लिक करें ।
  8. कॉलम सेटिंग बदलें। आप नमूना डेटा भी देख सकते हैं। आप अगला . क्लिक करके इसे छोड़ सकते हैं या जैसा आप ठीक समझें सेटिंग बदलें।
  9. आयात करेंक्लिक करें ।
  10. उसी ऑन-स्क्रीन निर्देशों का पालन करके अगली तालिका आयात करें।
  11. समाप्तक्लिक करें ।

इन तालिकाओं को आयात करने के बाद, अब आप इस आलेख में उदाहरणों के लिए तैयार हैं। तो चलिए शुरू करते हैं।

1. सिंटैक्स मूल बातें

MySQL अद्यतन विवरण वाक्य रचना इस प्रकार है:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

वाक्य रचना पढ़ने के बाद मैं आपको लगभग सुन सकता हूं:कम प्राथमिकता, IGNORE, ORDER BY, और LIMIT फिट नहीं है! आइए ऊपर से चर्चा शुरू करें।

सबसे पहले, LOW_PRIORITY हमारे लिए एक एलियन कीवर्ड है क्योंकि SQL सर्वर इसका समर्थन नहीं करता है। यह वैकल्पिक है, लेकिन यदि आप इसे शामिल करते हैं, तो अपडेट तब तक विलंबित होते हैं जब तक कि अन्य सभी क्लाइंट तालिका को नहीं पढ़ रहे हों।

एक अन्य विदेशी कीवर्ड इग्नोर है। यह वैकल्पिक भी है, लेकिन यदि आप इसे शामिल करते हैं और डुप्लिकेट होते हैं, तो कोई त्रुटि नहीं उठाई जाएगी। अधिक अनदेखी त्रुटियों के लिए, इस लिंक को देखें।

फिर, ऑर्डर बाय। हम जानते हैं कि यह किस लिए है। लेकिन इसे SQL सर्वर प्रबंधन स्टूडियो में आज़माएं और कीवर्ड के नीचे स्क्विगली लाइनें दिखाई देंगी।

अंत में, LIMIT. यह SQL सर्वर में TOP जैसा ही है। इसके बारे में और बाद के अनुभाग में ऑर्डर करें।

ये स्पष्ट अंतर हैं। अगले 2 उपखंडों में आगे पढ़ें।

MySQL अद्यतन सिंगल कॉलम

एक कॉलम को अपडेट करना लगभग समान है। तो, नीचे दिया गया उदाहरण दोनों डेटाबेस प्लेटफॉर्म से समान परिणाम देगा। ध्यान दें, हालांकि, बैकटिक्स के बजाय, SQL सर्वर वर्ग कोष्ठक का उपयोग करता है।

-- MySQL UPDATE single column
UPDATE `production.product`
SET ReorderPoint = 650
WHERE ProductID = 316;

यहाँ एक समान T-SQL सिंटैक्स है:

-- T-SQL UPDATE single column
UPDATE [Production].[Product]
SET ReorderPoint = 650
WHERE ProductID = 316;

कॉलम को असाइन किया गया मान कोई एकल-मान एक्सप्रेशन हो सकता है, जब तक कि लौटाया गया प्रकार कॉलम के डेटा प्रकार के समान हो।

MySQL एकाधिक कॉलम अपडेट करें

कई कॉलम को अपडेट करना भी लगभग टी-एसक्यूएल के समान है। यहां एक उदाहरण दिया गया है:

UPDATE `production.product`
SET ReorderPoint = 650, SafetyStockLevel = 1200
WHERE ProductID = 316;

अनेक स्तंभों को अद्यतन करने के लिए, बस स्तंभ-मान युग्मों को अल्पविराम से अलग करें। फिर से, यहाँ केवल बैकटिक्स का अंतर है।

अब तक, ये सभी सिंगल टेबल अपडेट हैं। आइए किसी अन्य तालिका से MySQL अद्यतन पर चलते हैं।

2. शामिल होने के साथ MySQL अद्यतन करें

जॉइन के साथ तालिका को अपडेट करते समय आप मामूली अंतर देखेंगे। इसे दिखाने का सबसे अच्छा तरीका 3 टेबल का उपयोग करने का उदाहरण है।

UPDATE `sales.salesorderdetail` sod
INNER JOIN `sales.salesorderheader` soh ON sod.SalesOrderID = soh.SalesOrderID
INNER JOIN `production.product` p ON sod.ProductID = p.ProductID
set UnitPrice = p.ListPrice
WHERE p.ProductID = 758
AND soh.OrderDate = '2012-04-30';

ध्यान दें कि SQL सर्वर की तुलना में कुछ क्लॉज अलग तरीके से व्यवस्थित होते हैं। SET क्लॉज से पहले जॉइन पहले दिखाई देते हैं। FROM क्लॉज भी नहीं है। जैसा कि आप उम्मीद कर सकते हैं, SQL सर्वर प्रबंधन स्टूडियो आपत्तिजनक सिंटैक्स के लिए स्क्विगली लाइनें डालेगा। नीचे चित्र 1 में इसे और सही T-SQL सिंटैक्स देखें।

अद्यतन से पहले, इकाई मूल्य मूल्य 874.7940 है जैसा कि चित्र 2 में देखा गया है।

अपडेट के बाद, UnitPrice उत्पाद . से अपडेट किया जाता है तालिका का सूची मूल्य . चित्र 3 देखें।

इनर जॉइन के अलावा, आप अपनी आवश्यकताओं के आधार पर लेफ्ट या राइट जॉइन का उपयोग कर सकते हैं।

3. सबक्वेरी के साथ MySQL अपडेट करें

आप सबक्वेरी का उपयोग करके किसी अन्य तालिका से MySQL अद्यतन विवरण का उपयोग कर सकते हैं। पिछले अनुभाग में शामिल होने वाली क्वेरी को सबक्वेरी का उपयोग करके फिर से लिखा जा सकता है। परिणाम वही होंगे। ये रहा:

UPDATE `sales.salesorderdetail` sod
INNER JOIN `sales.salesorderheader` soh ON sod.SalesOrderID = soh.SalesOrderID
SET sod.UnitPrice = (select ListPrice from `production.product` WHERE ProductID = 758)
WHERE sod.ProductID = 758
AND soh.OrderDate = '2012-04-30';

दृष्टिकोण अलग है, लेकिन परिणाम चित्र 3 जैसा ही है। हालांकि, ध्यान दें कि किसी कॉलम को अपडेट करने के लिए उपयोग की जाने वाली सबक्वेरी को 1 मान वापस करना चाहिए।

इस MySQL अद्यतन कथन को व्यक्त करने का एक और तरीका है।

4. सीटीई के साथ MySQL अद्यतन

कॉमन टेबल एक्सप्रेशन (CTE) MySQL और SQL सर्वर दोनों में समर्थित हैं। यदि आप सीटीई से अपरिचित हैं, तो पिछला लेख देखें।

अब, यहां इस्तेमाल किए गए सीटीई के समकक्ष स्टेटमेंट दिया गया है।

WITH priceIncrease AS
(
  SELECT soh.SalesOrderID, p.ProductID, p.ListPrice
  FROM `sales.salesorderdetail` sod
  INNER JOIN `sales.salesorderheader` soh ON sod.SalesOrderID = soh.SalesOrderID
  INNER JOIN `production.product` p ON sod.ProductID = p.ProductID
  WHERE p.ProductID = 758
  AND soh.OrderDate = '2012-04-30'
)
UPDATE `sales.salesorderdetail` s
INNER JOIN priceIncrease pi ON s.SalesOrderID = pi.SalesOrderID AND s.ProductID = pi.ProductID
SET s.UnitPrice = pi.ListPrice

SQL सर्वर समान अवधारणा का समर्थन करता है, लेकिन बिना बैकटिक्स के। परिणाम चित्र 3 जैसा ही होगा।

आप पूछ सकते हैं कि 3 में से कौन सा दृष्टिकोण बेहतर है? हम आगे उनके प्रदर्शन की तुलना करेंगे।

5. MySQL अद्यतन LIMIT के साथ

MySQL अद्यतन LIMIT कीवर्ड के साथ अद्यतन करने के लिए पंक्तियों की संख्या को सीमित कर सकता है। मान लीजिए हम उत्पाद . में 5 रिकॉर्ड अपडेट करना चाहते हैं टेबल। हम कथन को इस प्रकार व्यक्त कर सकते हैं:

UPDATE `production.product` p
SET p.StandardCost = p.StandardCost + 10, p.ListPrice = p.ListPrice + 10
ORDER BY p.ProductID
LIMIT 5;

यह ProductID . के आधार पर रिकॉर्ड्स को सॉर्ट करेगा , और उसके बाद पहले 5 रिकॉर्ड अपडेट करें। यह 5वें रिकॉर्ड के बाद रुक जाता है।

SQL सर्वर का LIMIT का समकक्ष TOP है। हालाँकि, आप केवल LIMIT कीवर्ड को TOP में नहीं बदल सकते हैं और उम्मीद करते हैं कि यह SQL सर्वर में काम करेगा। यहाँ T-SQL में संशोधित संस्करण दिया गया है जो समान परिणाम देगा:

UPDATE Production.Product
SET StandardCost += 10, ListPrice += 10
WHERE ProductID IN (SELECT TOP 5 ProductID 
		    FROM Production.Product 
		    ORDER BY ProductID)

तर्क थोड़ा अलग है। यह मानक लागत . को अपडेट करता है और सूची मूल्य सबक्वेरी में मिले ProductIDs के आधार पर कॉलम। दूसरी ओर, उपश्रेणी उत्पाद . के पहले 5 रिकॉर्ड लौटाती है ProductID . द्वारा क्रमबद्ध तालिका ।

हालांकि टी-एसक्यूएल अपडेट में टॉप भी समर्थित है, ऑर्डर बाय नहीं है। इस प्रकार, UPDATE के साथ TOP का उपयोग करने से यादृच्छिक रिकॉर्ड संशोधित होंगे। उपरोक्त सिंटैक्स टॉप के साथ ऑर्डर किए गए रिकॉर्ड के लिए लागू होता है।

MySQL अद्यतन प्रदर्शन

इससे पहले, हमारे पास एक ही परिणाम के साथ एक अद्यतन विवरण था, भले ही हमने विभिन्न विधियों का उपयोग किया हो। हमने जॉइन, सबक्वेरी और सीटीई का इस्तेमाल किया। उनमें से कौन सबसे अच्छा प्रदर्शन करेगा?

EXPLAIN कीवर्ड का उपयोग करके MySQL में एक निष्पादन योजना भी है। वाक्य रचना इस प्रकार है:

EXPLAIN [FORMAT=JSON]
<SQL statement>

JSON प्रारूप के बिना, आपके पास टेबल, उपयोग की गई अनुक्रमणिका कुंजियों और स्कैन की गई पंक्तियों जैसी मूलभूत जानकारी होती है। जब JSON प्रारूप निर्दिष्ट किया जाता है, तो आपके पास अधिक विस्तृत जानकारी होती है। MySQL के लिए dbForge Studio में EXPLAIN के परिणाम के अलावा एक क्वेरी प्रोफाइलर भी शामिल है। MySQL वर्कबेंच में एक विजुअल EXPLAIN शामिल है जहां आप EXPLAIN FORMAT=JSON पर आधारित योजना का ग्राफिकल दृश्य देख सकते हैं।

अब जब हम कमांड लाइन स्टेटमेंट और ग्राफिकल टूल जानते हैं, तो हम विभिन्न तरीकों की तुलना करने के लिए उनका उपयोग कैसे कर सकते हैं?

आगे बढ़ने से पहले, मुझे ईमानदार होने दो। SQL सर्वर में मेरी दक्षता MySQL की तुलना में अधिक है। मुझे रास्ते में कुछ याद आ सकता है या गलत हो सकता है। आप बाद में टिप्पणी अनुभाग में अंतराल को भर सकते हैं।

जॉइन के साथ UPDATE के लिए EXPLAIN परिणाम विदारक करना

पहली बार जब मैंने जॉइन के साथ MySQL UPDATE स्टेटमेंट चलाया, तो 24 पंक्तियों को अपडेट करने में 11.3 सेकंड का समय लगा। अविश्वसनीय, है ना?

यहाँ वही हुआ जो dbForge Studio में देखा गया। नीचे चित्र 4 देखें।

चित्र 4 हमें क्या बताता है?

  1. इस्तेमाल किए गए 3 टेबल उपनाम हैं। सभी 3 में ALL के एक्सेस प्रकार हैं। इसका मतलब है कि MySQL ने सभी 3 के लिए टेबल स्कैन का इस्तेमाल किया है।
  2. कुंजी देखें कॉलम। सभी 3 तालिकाओं पर कुछ भी प्रदर्शित नहीं होता है, जिसका अर्थ है कि कोई अनुक्रमणिका कुंजियों का उपयोग नहीं किया गया था। यह टेबल स्कैन के पिछले बिंदु का समर्थन करता है।
  3. आखिरकार, पंक्तियां कॉलम। यह बताता है कि अंतिम परिणाम प्राप्त करने के लिए MySQL को कितनी पंक्तियों को स्कैन करना चाहिए। अपडेट की गई 24 पंक्तियों के लिए, SalesOrderHeader . के लिए हज़ारों पंक्तियों को स्कैन किया गया और SalesOrderDetails . इस बीच, उत्पाद . की सभी पंक्तियां तालिका स्कैन की गई।

यह जानने के बाद मैंने अपना सिर खुजलाया। मैंने महसूस किया कि जब मैंने SQL सर्वर से तालिकाएँ आयात कीं, तो केवल तालिका संरचना और डेटा आयात किया गया, अनुक्रमणिका नहीं

इसलिए, मैंने dbForge Studio में उपयुक्त अनुक्रमणिका और प्राथमिक कुंजियाँ बनाईं। यहाँ मैंने क्या बनाया है:

  • मैंने ProductID बनाया है उत्पाद . में तालिका एक प्राथमिक कुंजी।
  • मैंने SalesOrderID भी जोड़ा है SalesOrderHeader . में प्राथमिक कुंजी के रूप में टेबल। फिर, मैंने आदेश दिनांक . के लिए एक अनुक्रमणिका बनाई भी।
  • आखिरकार, मैंने SalesOrderDetailID . बनाया SalesOrderDetail . में तालिका एक प्राथमिक कुंजी। मैंने SalesOrderID . के लिए एक अनुक्रमणिका भी जोड़ी है और ProductID इस तालिका के कॉलम।

इसके बाद, मैंने सुधार देखने के लिए उसी क्वेरी के लिए एक नई निष्पादन योजना तैयार की। नतीजा?

इंडेक्स जोड़ने के बाद स्पीड बूस्ट

निष्पादन का समय 11.3 सेकंड से घटाकर 0.019 सेकंड कर दिया गया। बहुत बढ़िया!

आइए नीचे चित्र 5 में dbForge Studio का उपयोग करके नई योजना देखें।

चित्र 5 हमें क्या बताता है?

  • पहुंच प्रकार 3 टेबल बदल दिए गए हैं। यहां से बचने के लिए 2 मान ALL और INDEX हैं, खासकर बड़ी टेबल पर। ALL टेबल स्कैन है और INDEX इंडेक्स स्कैन है।
  • कुंजी कॉलम अब इस्तेमाल किए गए इंडेक्स शामिल हैं। यह अच्छा है। जोड़े गए सभी इंडेक्स का इस्तेमाल किया गया।
  • पंक्तियां कॉलम अब छोटे आंकड़े दिखाता है। जोड़े गए इंडेक्स ने हमारी क्वेरी पर बहुत सारे I/O को कम कर दिया।

EXPLAIN विवरण और मूल्यों के बारे में अधिक जानकारी के लिए, इस आधिकारिक दस्तावेज़ीकरण की जाँच करें।

लेकिन यह सबक्वेरी के साथ MySQL UPDATE की तुलना कैसे करता है?

अपडेट के लिए EXPLAIN परिणामों को सबक्वेरी के साथ विभाजित करना

UnitPrice . को अपडेट करने के लिए पिछली क्वेरी कॉलम में एक और क्वेरी विकल्प है, जो एक सबक्वेरी का उपयोग कर रहा है। यह जॉइन की तुलना कैसे करता है? नीचे चित्र 6 देखें।

चित्र 6 दिखाता है:

  • जॉइन का उपयोग करने की तुलना में टाइप, की और रो कॉलम वैल्यू समान हैं। यह तार्किक है क्योंकि इसके समान परिणाम होने चाहिए।
  • निष्पादन का समय थोड़ा तेज हो गया। हालांकि ऐसा हर बार नहीं होगा। यह वर्तमान उपलब्ध संसाधनों पर निर्भर करता है। गति अंतर भी नगण्य है। आप इसे बिल्कुल भी महसूस नहीं करेंगे।

एक अन्य तरीका योजना के बारे में अधिक जानकारी प्राप्त करने के लिए EXPLAIN FORMAT=JSON का उपयोग करना है। जाँच करने पर, क्वेरी लागत (84.79) और लागत जानकारी मान समान होते हैं।

अब, इसकी तुलना MySQL UPDATE और CTE से करते हैं।

अद्यतन के लिए CTE के साथ EXPLAIN परिणाम विदारक करना

UnitPrice . को अपडेट करने के लिए आधार के रूप में CTE का उपयोग करना कॉलम पहले एक अस्थायी तालिका होने और फिर अस्थायी तालिका को SalesOrderDetails में शामिल करने जैसा है . पहली नज़र में, ऐसा लग सकता है कि यह पहले दो की तुलना में एक अच्छा विकल्प नहीं है। लेकिन यह हमें दिखाता है कि सीटीई का उपयोग करके MySQL में अपडेट होना संभव है। यह अन्य स्थितियों में एक अच्छा विकल्प हो सकता है। वैसे भी, आइए इस दृष्टिकोण के लिए EXPLAIN परिणाम देखें।

यदि आपके पास MySQL के लिए dbForge Studio नहीं है, तो आप किसी अन्य संपादक में कमांड का उपयोग करके EXPLAIN परिणाम उत्पन्न करने का प्रयास कर सकते हैं। यहां एक उदाहरण दिया गया है:

EXPLAIN
WITH priceIncrease AS
(
  SELECT soh.SalesOrderID, p.ProductID, p.ListPrice
  FROM `sales.salesorderdetail` sod
  INNER JOIN `sales.salesorderheader` soh ON sod.SalesOrderID = soh.SalesOrderID
  INNER JOIN `production.product` p ON sod.ProductID = p.ProductID
  WHERE p.ProductID = 758
  AND soh.OrderDate = '2012-04-30'
)
UPDATE `sales.salesorderdetail` s
INNER JOIN priceIncrease pi ON s.SalesOrderID = pi.SalesOrderID AND s.ProductID = pi.ProductID
SET s.UnitPrice = pi.ListPrice

परिणाम नीचे चित्र 7 में है।

चित्र 7 दिखाता है:

  • 3 के बजाय 4 टेबल का उपयोग किया गया था। SalesOrderDetail . का पहला उपयोग CTE में है और फिर UPDATE स्टेटमेंट में है।
  • अधिक तालिकाओं का अर्थ है पिछले 2 दृष्टिकोणों की तुलना में अधिक पंक्तियाँ।

हैरानी की बात यह है कि यह 0.015 सेकेंड पर चला (आंकड़े में नहीं दिखाया गया)। सबक्वेरी का उपयोग करने के साथ भी ऐसा ही है। हालांकि, यह हर बार नहीं होगा। यह निष्पादन के समय उपलब्ध सिस्टम संसाधनों पर निर्भर करता है।

कुल क्वेरी लागत 166.69 है। यह पिछले 2 दृष्टिकोणों से अधिक है। क्वेरी की लागत जितनी कम होगी, समय के साथ प्रदर्शन के लिए उतना ही बेहतर होगा।

टेकअवे

हमने MySQL और SQL सर्वर के UPDATE स्टेटमेंट के बीच के अंतरों पर गहराई से विचार किया। हमने सीखा है कि अपडेट करते समय इसे कैसे किया जाता है

  • एकल कॉलम
  • एकाधिक कॉलम
  • शामिल होने वाली टेबल
  • उपश्रेणी का उपयोग करने वाले स्तंभ
  • सीटीई के साथ टेबल
  • एक सीमा के साथ

इस पोस्ट में, आपने EXPLAIN के बारे में और विभिन्न UPDATE दृष्टिकोणों की तुलना करने के लिए इसका उपयोग करने के तरीके के बारे में भी जानकारी प्राप्त की थी।

मुझे उम्मीद है कि यह आपके लिए मददगार हो सकता है क्योंकि आप SQL सर्वर से आने वाले MySQL को सीखते हैं। अगर आपको यह पोस्ट पसंद आई हो तो कृपया इसे अपने पसंदीदा सोशल मीडिया प्लेटफॉर्म पर शेयर करें। और अगर कुछ कमी है, तो हमें कमेंट सेक्शन में बताएं।

हैप्पी कोडिंग!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ClusterControl के साथ अपने MySQL बैकअप को कैसे सत्यापित करें

  2. फायरबेस का परिचय

  3. क्लाउड फायरस्टोर डेटाबेस में डेटा जोड़ना

  4. वाइल्डकार्ड का उपयोग करके XXX से प्रारंभ होने वाले सभी स्तंभों का चयन करना?

  5. मैं अजगर mysql क्वेरी से% कैसे बच सकता हूं?