คุณสมบัติที่ซ่อนของ MySQL


15

ในประเพณีอันยาวนานของการมีฟีเจอร์ที่ซ่อนอยู่ให้เรามีรายการฟีเจอร์ที่ซ่อนอยู่ใน MySQL

ใส่หนึ่งคุณลักษณะต่อคำตอบ

ดูเพิ่มเติมที่:
คุณสมบัติที่ซ่อนอยู่ของ Linux
คุณสมบัติที่ซ่อนของ PowerShell
คุณสมบัติที่ซ่อนของ Oracle Database
คุณสมบัติที่ซ่อนของ Windows 2008
คุณสมบัติที่ซ่อนของ Solaris / OpenSolaris
คุณสมบัติที่ซ่อนของ SQL Server
คุณสมบัติที่ซ่อนของ IIS (6.0 / 7.0)

คำตอบ:


9

verbose ที่ไม่ได้ใช้บ่อย แต่มีความหมายมากกว่า

แสดงกระบวนการทั้งหมด

มีประโยชน์ แต่ไม่ดีเท่าโปรแกรมวิเคราะห์คิวรีที่ไม่ใช่องค์กร - ใช้งานได้

    mysql> กำหนดสถานะการทำโปรไฟล์ = 1;
    การค้นหาตกลง 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)

ทั้งสองนี้เป็นแบบสอบถามขยะเพื่อเติมตารางโปรไฟล์

        
    mysql> select * จาก _test.customers
    ข้อผิดพลาด 1146 (42S02): ไม่มีตาราง '_test.customers'

    mysql> select * จาก test.customers จำกัด 0;
    ชุดว่าง (0.00 วินาที)
    

รับรายการแบบสอบถามทั้งหมดที่ทำประวัติและระยะเวลา

        
    mysql> แสดงโปรไฟล์;
    + + ---------- ------------ + ------------------------- ------ +
    | Query_ID | ระยะเวลา | ข้อความค้นหา |
    + + ---------- ------------ + ------------------------- ------ +
    | 1 | 0.00013400 | เลือก * จาก _test.customers |
    | 2 | 0.01546500 | เลือก * จาก test.customers |
    + + ---------- ------------ + ------------------------- ------ +

แสดงข้อมูลสำหรับการค้นหาล่าสุดจะเป็น "แสดงโปรไฟล์" - หรือคุณสามารถระบุแบบสอบถาม

  
    mysql> แสดงโปรไฟล์ของการสืบค้น 2
    + ---------------------- + + ----------
    | สถานะ | ระยะเวลา |
    + ---------------------- + + ----------
    | เริ่มต้น | 0.000053 |
    | ตรวจสอบสิทธิ์ | 0.000007 |
    | เปิดตาราง | 0.000014 |
    | ล็อคระบบ 0.000006 |
    | ล็อคตาราง 0.000008 |
    | init | 0.000065 |
    | การเพิ่มประสิทธิภาพ | 0.000003 |
    | กำลังดำเนินการ | 0.000201 |
    | สิ้นสุด | 0.000003 |
    | แบบสอบถามสิ้นสุด | 0.000002 |
    | รายการพ้น 0.000020 |
    | เข้าสู่ระบบแบบสอบถามช้า 0.000002 |
    | ทำความสะอาด 0.000004 |
    + ---------------------- + + ----------
    13 แถวในชุด (0.00 วินาที)

นอกจากนี้คุณยังสามารถขอข้อมูลเฉพาะเช่น CPU, BLOCK IO และ SWAPS ในหมู่ผู้อื่น ( ทั้งหมดในหน้าคน )

  
    mysql> แสดงซีพียูโปรไฟล์สำหรับคิวรี่ 2;
    + ---------------------- + + ---------- ---------- + ---- -------- +
    | สถานะ | ระยะเวลา | CPU_user | CPU_system |
    + ---------------------- + + ---------- ---------- + ---- -------- +
    | เริ่มต้น | 0.000056 | 0.001000 | 0.000000 |
    | ตรวจสอบสิทธิ์ | 0.000007 | 0.000000 | 0.000000 |
    | เปิดตาราง | 0.000010 | 0.000000 | 0.000000 |
    | ล็อคระบบ 0.000005 | 0.000000 | 0.000000 |
    | ล็อคตาราง 0.000007 | 0.000000 | 0.000000 |
    | init | 0.000059 | 0.000000 | 0.000000 |
    | การเพิ่มประสิทธิภาพ | 0.000003 | 0.000000 | 0.000000 |
    | สถิติ 0.015022 | 0.000000 | 0.000000 |
    | กำลังเตรียม 0.000014 | 0.001000 | 0.000000 |
    | กำลังดำเนินการ | 0.000004 | 0.000000 | 0.000000 |
    | กำลังส่งข้อมูล | 0.000245 | 0.000000 | 0.000000 |
    | สิ้นสุด | 0.000004 | 0.000000 | 0.000000 |
    | แบบสอบถามสิ้นสุด | 0.000002 | 0.000000 | 0.000000 |
    | รายการพ้น 0.000021 | 0.000000 | 0.000000 |
    | เข้าสู่ระบบแบบสอบถามช้า 0.000002 | 0.000000 | 0.000000 |
    | ทำความสะอาด 0.000004 | 0.000000 | 0.000000 |
    + ---------------------- + + ---------- ---------- + ---- -------- +
    16 แถวในชุด (0.00 วินาที)

อย่าลืมปิดการใช้งานหลังจากนั้นเนื่องจากการบันทึกเพิ่มค่าใช้จ่าย

  
    mysql> set profiling = 0;
    การค้นหาตกลง 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)

คุณยังสามารถใช้ SHOW PROFILE ALL สำหรับ QUERY X เพื่อแสดงข้อมูลการทำโปรไฟล์ทั้งหมด
Kedare

8

คำสั่ง MySQLบางคำสั่งที่มักไม่รู้จักหรือจำได้เสมอ

เปลี่ยนการวางแนวชุดผลลัพธ์เป็นแนวตั้งเพื่อให้ง่ายต่อการอ่านและวาง

mysql> SELECT CURDATE(), CURTIME()\G
*************************** 1. row ***************************
CURDATE(): 2009-06-26
CURTIME(): 12:10:37

ยกเลิกแบบสอบถามที่คุณกำลังพิมพ์ในขณะที่ทิ้งไว้ในประวัติของคุณ

mysql> SELECT CURDATE(), CURTIME()\c
mysql>

แก้ไขคิวรีหรือคิวรีสุดท้าย (ตามลำดับ) ด้วย $ EDITOR ที่คุณชื่นชอบ

mysql> SELECT CURDATE(), CURTIME()\e
mysql> \e

เคลียร์เอาต์พุตของคอนโซล

mysql> \! clear

เปรียบเทียบชุดผลลัพธ์ด้วยแฮช MD5

mysql> pager md5sum -
PAGER set to 'md5sum -'
mysql> SELECT CURDATE(), CURTIME();
d24e22e4e2d33dfda9f01ba934b7676a  -
mysql> nopager
PAGER set to stdout

เปลี่ยนพรอมต์ของคุณ

mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(dan@localhost) [test]>

ค้นหาประวัติคำสั่งของคุณสำหรับสตริงที่กำหนด (เช่น Bash)
เริ่มพิมพ์ข้อความค้นหาและทำซ้ำ ^ R เพื่อหมุนเวียนผลลัพธ์

^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();

+1 ใน md5sum ฉันชอบmd5sum -ความคิดที่จะใช้เป็นเพจเจอร์ ไม่เฉพาะเจาะจง MySQL จริงๆ
serverhorror

4

เคล็ดลับที่ฉันได้เรียนรู้ว่าอาจมีประโยชน์สำหรับบางคน:

วิธีเรียกใช้ไฟล์ที่คุณบันทึกไว้ก่อนหน้านี้:

source filename      # Alternatively you can enter "\\. filename".

ใช้ "\!" เพื่อเข้าถึงคำสั่งเชลล์ ตัวอย่างเช่น:

\\! ls c*sql   # To list all your SQL files in directory starting with "c".

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

\\! echo 'select * from emp where job ="salesman" '   > test2.sql   # Editor option seems easier to me though!

หากคุณป้อน

\\T filename

จากนั้นคุณจะมีข้อความสั่งและผลการสืบค้นที่กำกับ / พิมพ์ไปยังไฟล์ที่คุณระบุ ใช้\\tเพื่อปิดการทำงานนี้

ยุติการสืบค้นด้วย\\Gแทนที่จะเป็น ";" เพื่อแสดงผลลัพธ์ในรูปแบบแถวแทนที่จะเป็นในคอลัมน์

อย่าออกกฎโดยใช้ส่วนคำสั่ง Where ... LIKE ด้วยคำสั่ง SHOW ตัวอย่างเช่น:

SHOW STATUS LIKE '%cache%';

สุดท้ายเพื่อค้นหาตำแหน่งของไดเรกทอรีข้อมูล MySQL ของคุณโดยไม่ต้องดูการmy.cnfใช้ไฟล์:

SHOW VARIABLES LIKE 'datadir';

3

ฉันชอบSHOWคำสั่งเป็นการส่วนตัว

คุณสามารถทำได้
SHOW PROCESSLIST- เพื่อดูการเชื่อมต่อที่กำลังทำงานอยู่กับ mysql
SHOW CREATE TABLE TableName- เพื่อดู sql ที่ใช้ในการสร้างตาราง
SHOW CREATE PROCEDURE ProcedureName- เพื่อดู sql ที่ใช้ในการสร้าง SP
SHOW VARIABLES- เพื่อดูตัวแปรระบบทั้งหมด

รับรายชื่อเต็มได้ที่นี่


1
ฉันรู้สึกสับสนนิดหน่อยที่คุณแสดงรายการคำสั่งที่รู้ดีและมีเอกสารเช่น SHOW และอธิบายว่าเป็น "คุณสมบัติที่ซ่อนอยู่" ไม่ใช่คุณลักษณะที่ซ่อนอยู่ที่ไม่ได้บันทึกไว้ใช่ไหม
John Gardeniers

ด้วยความตั้งใจที่จะนำเอาคำสั่งที่มีประโยชน์ที่ไม่ค่อยเป็นที่รู้จักมาก่อนใครจะรู้ได้อย่างไรว่าคนอื่นอาจไม่รู้จัก
Binoj Antony

3

เอกสารจริงแต่น่ารำคาญมาก: การแปลงวันที่โดยอัตโนมัติสำหรับข้อมูลที่ไม่ถูกต้อง

ก่อนที่ MySQL 5.0.2, MySQL จะให้อภัยค่าข้อมูลที่ผิดกฎหมายหรือไม่เหมาะสมและบังคับให้ค่าทางกฎหมายสำหรับการป้อนข้อมูล ใน MySQL 5.0.2 และสูงกว่านั้นยังคงเป็นพฤติกรรมเริ่มต้น แต่คุณสามารถเปลี่ยนโหมดเซิร์ฟเวอร์ SQL เพื่อเลือกการรักษาค่าที่ไม่ดีเช่นเซิร์ฟเวอร์ปฏิเสธและยกเลิกคำสั่งที่เกิดขึ้น

บางครั้งคุณจะ "โชคดี" เมื่อ MySQL ไม่ปรับอินพุตให้ใกล้เคียงกับวันที่ที่ถูกต้อง แต่ควรจัดเก็บตาม0000-00-00ที่นิยามไม่ถูกต้อง อย่างไรก็ตามแม้ว่าคุณอาจต้องการให้ MySQL ล้มเหลวแทนที่จะเก็บค่านี้ไว้สำหรับคุณ


3

คุณสมบัติอื่นที่กำหนด MySQL แยกจากฐานข้อมูลอื่นคือREPLACE INTOคำสั่ง คุณทำได้:

REPLACE INTO T1 (Col1, Col2 )
SELECT Col1, Col2 FROM T2;

คุณยังสามารถเขียนคำสั่ง replace เช่นเดียวกับที่คุณเขียนคำสั่ง update:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'

1
แทนที่เป็นประโยชน์ แต่ควรสังเกตว่ามันทำการตรวจสอบกุญแจลบถ้าพบกุญแจที่ตรงกันแล้วในที่สุดแทรกซึ่งใช้เวลานานกว่า INSERT ... ในการอัปเดตคีย์ซ้ำ
Andy

2

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

INSERT ... ON DUPLICATE KEY UPDATE

เอกสารอยู่ที่นี่


1

หากต้องการดูแผนการดำเนินการแบบสอบถามให้ใช้ EXPLAIN

เช่น

EXPLAIN 
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10

1

ไม่ถูกซ่อนอยู่จริงๆ แต่การสืบค้นข้อมูลช้าจะมีประโยชน์มากในการติดตามสาเหตุของปัญหาประสิทธิภาพในช่วงเวลาเร่งด่วน

ในไฟล์my.cnf[mysqld] ส่วน - เพิ่ม:

log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1

0

ดีไม่สามารถทำเครื่องหมายสิ่งนี้ว่าซ้ำซ้อนเนื่องจากเป็นไซต์อื่น (และฉันไม่มีตัวแทนที่นี่) แต่ฉันจะลิงก์ไปยังโพสต์สแต็คโอเวอร์โฟลว์ที่ยอดเยี่ยมสำหรับคำถามเดียวกัน :


0

เช่นเดียวกับคำตอบของ pQD (เช่น noobie ฉันยังไม่สามารถเพิ่มความคิดเห็น) ถ้าคุณยังไม่ได้เพิ่มเส้นทางไปยังบันทึกการสืบค้นที่ช้าในไฟล์ my.cnf ที่ถูกต้องบันทึกข้อผิดพลาดจะเป็น เขียนไปยังไดเรกทอรีข้อมูล (ใช้ SHOW VARIABLES LIKE 'datadir' เพื่อค้นหาว่าอยู่ที่ไหน) และชื่อไฟล์จะอยู่ในรูปแบบ [systemname] -slow.log

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