SQLite สร้างตาราง เริ่มต้นด้วย SQLite3 - คำสั่งพื้นฐาน วิธีสร้างฐานข้อมูลและแทรกข้อมูลต่างๆ

MySQL ยังคงเป็นที่นิยมมากที่สุดในโลก ฐานสัมพันธ์ข้อมูล แต่ในขณะเดียวกันก็ไม่ได้เพิ่มประสิทธิภาพมากที่สุด หลายๆ คนยังคงใช้การตั้งค่าเริ่มต้นโดยไม่ต้องเจาะลึกลงไปอีก ในบทความนี้ เราจะดูเคล็ดลับการเพิ่มประสิทธิภาพ MySQL รวมกับคุณลักษณะใหม่บางอย่างที่ออกมาค่อนข้างเร็ว

การเพิ่มประสิทธิภาพการกำหนดค่า

สิ่งแรกก็คือทุกคน ผู้ใช้ MySQLควรทำการปรับปรุงประสิทธิภาพคือการปรับการกำหนดค่า อย่างไรก็ตาม คนส่วนใหญ่ข้ามขั้นตอนนี้ บี 5.7 ( รุ่นปัจจุบัน) การตั้งค่าเริ่มต้นนั้นดีกว่ารุ่นก่อนมาก แต่การปรับปรุงยังคงเป็นไปได้และง่ายดาย

เราหวังว่าคุณจะใช้ Linux หรือบางอย่างเช่น Vagrant -box (เช่น Homestead Enhanced ของเรา) และด้วยเหตุนี้ ไฟล์การกำหนดค่าของคุณจะอยู่ใน /etc/mysql/my.cnf เป็นไปได้ว่าการติดตั้งของคุณจะโหลดจริง ไฟล์เพิ่มเติมการกำหนดค่าในอันนี้ ดังนั้นลองดูว่าไฟล์ my.cnf มีไม่มาก ให้ลองดูใน /etc/mysql/mysql.conf.d/mysqld.cnf

การปรับจูนด้วยตนเอง

การตั้งค่าต่อไปนี้ควรทำตั้งแต่แกะกล่อง ตามเคล็ดลับเหล่านี้ ให้เพิ่มไฟล์ปรับแต่งในส่วนนี้:

Innodb_buffer_pool_size = 1G # (ที่นี่เปลี่ยนประมาณ 50% -70% ของ RAM ทั้งหมด) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # สามารถเปลี่ยนเป็น 2 หรือ 0 innodb_flush_method = O_DIRECT

  • innodb_buffer_pool_size . บัฟเฟอร์พูลเป็น "คลังสินค้า" ประเภทหนึ่งสำหรับการแคชข้อมูลและดัชนีในหน่วยความจำ มันถูกใช้เพื่อจัดเก็บข้อมูลที่เข้าถึงบ่อยไว้ในหน่วยความจำ และเมื่อคุณใช้เฉพาะหรือ เซิร์ฟเวอร์เสมือนซึ่งมักจะเป็นฐานข้อมูลที่เป็นคอขวดนั่นคือมันสมเหตุสมผลที่จะให้มัน ที่สุดเจ้าหน้าที่ปฏิบัติการ ดังนั้นเราจึงให้ 50-70% ของ RAM ทั้งหมด มีคำแนะนำในการตั้งค่าพูลนี้ในเอกสารประกอบ MySQL
  • innodb_log_file_size . การตั้งค่าขนาดไฟล์บันทึกอธิบายไว้อย่างดี แต่โดยสรุปคือจำนวนข้อมูลที่จัดเก็บไว้ในบันทึกก่อนที่จะถูกล้าง โปรดทราบว่าบันทึกในกรณีนี้ไม่ใช่บันทึกข้อผิดพลาด แต่เป็นสแน็ปช็อตเดลต้าของการเปลี่ยนแปลงที่ยังไม่ได้ถูกล้างลงดิสก์ในไฟล์ Innodb หลัก MySQL เขียนถึง พื้นหลังแต่สิ่งนี้ยังคงส่งผลต่อประสิทธิภาพในขณะที่บันทึก ไฟล์บันทึกขนาดใหญ่มีความหมายมากกว่านั้น ประสิทธิภาพสูงเนื่องจากจุดควบคุมใหม่และจุดควบคุมขนาดเล็กที่สร้างขึ้นมีจำนวนน้อย แต่ในขณะเดียวกันก็มีมากกว่านั้น เวลานานการกู้คืนในกรณีที่เกิดข้อขัดข้อง (ต้องเขียนข้อมูลเพิ่มเติมลงในฐานข้อมูล)
  • มีการอธิบาย innodb_flush_log_at_trx_commit และแสดงสิ่งที่เกิดขึ้นกับไฟล์บันทึก ค่า 1 นั้นปลอดภัยที่สุด เนื่องจากบันทึกจะถูกล้างลงดิสก์หลังจากแต่ละธุรกรรม ด้วยค่า 0 และ 2 รับประกัน ACID น้อยกว่า แต่ประสิทธิภาพจะสูงกว่า ความแตกต่างไม่มากพอที่จะเกินดุลผลประโยชน์ด้านความมั่นคงที่ 1
  • innodb_flush_method เหนือสิ่งอื่นใดเมื่อพูดถึงการล้างข้อมูล การตั้งค่านี้จะต้องตั้งค่าเป็น O_DIRECT - เพื่อหลีกเลี่ยงการบัฟเฟอร์ซ้ำซ้อน ฉันแนะนำให้คุณทำเช่นนี้เสมอในขณะที่ระบบ I/O ยังคงช้ามาก แม้ว่าโฮสติ้งส่วนใหญ่ เช่น DigitalOcean คุณจะมีไดรฟ์ SSD ดังนั้นระบบ I/O จึงมีประสิทธิผลมากกว่า

มีเครื่องมือจาก Percona ที่จะช่วยให้เราค้นหาปัญหาที่เหลือโดยอัตโนมัติ โปรดทราบว่าหากเราดำเนินการโดยไม่มีสิ่งนี้ การตั้งค่าด้วยตนเองจากนั้นจะมีการกำหนดการตั้งค่าเพียง 1 ใน 4 รายการเท่านั้น เนื่องจากอีก 3 รายการขึ้นอยู่กับความชอบของผู้ใช้และ สิ่งแวดล้อมการใช้งาน

ตัวตรวจสอบตัวแปร

การติดตั้งตัวตรวจสอบตัวแปรบน Ubuntu:

รับ https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all. deb sudo apt-get อัปเดต sudo apt-get ติดตั้ง percona-toolkit

สำหรับระบบอื่นๆ ให้ปฏิบัติตามคำแนะนำเหล่านี้

จากนั้นรันชุดเครื่องมือ:

Pt-variable-advisor h=localhost,u=homestead,p=secret

คุณจะเห็นผลลัพธ์นี้:

# คำเตือน Delay_key_write: บล็อกดัชนี MyISAM จะไม่ถูกล้างจนกว่าจะจำเป็น # หมายเหตุ max_binlog_size: max_binlog_size เล็กกว่าค่าเริ่มต้นที่ 1GB # หมายเหตุ sort_buffer_size-1: โดยทั่วไปตัวแปร sort_buffer_size ควรปล่อยให้เป็นค่าเริ่มต้น เว้นแต่ผู้เชี่ยวชาญจะพิจารณาว่าจำเป็นต้องเปลี่ยนแปลง # หมายเหตุ innodb_data_file_path: ไฟล์ InnoDB ที่ขยายอัตโนมัติอาจใช้พื้นที่ดิสก์จำนวนมากซึ่งยากต่อการเรียกคืนในภายหลัง # คำเตือน log_bin: การบันทึกแบบไบนารีถูกปิดใช้งาน ดังนั้นการกู้คืนและการจำลองแบบ ณ เวลาใดเวลาหนึ่ง ไม่ได้เป็นไปได้.

บันทึก นักแปล:
เกี่ยวกับฉัน เครื่องท้องถิ่นนอกจากนี้ ยังได้ออกคำเตือนดังต่อไปนี้:

# หมายเหตุ innodb_flush_method: เซิร์ฟเวอร์ฐานข้อมูลที่ใช้งานจริงส่วนใหญ่ที่ใช้ InnoDB ควรตั้งค่า innodb_flush_method เป็น O_DIRECT เพื่อหลีกเลี่ยงการบัฟเฟอร์ซ้ำซ้อน เว้นแต่ระบบ I/O จะมีประสิทธิภาพต่ำมาก

ความจริงที่ว่าพารามิเตอร์ innodb_flush_method จำเป็นต้องตั้งค่าเป็น O_DIRECT และเหตุใดจึงมีการกล่าวถึงข้างต้น และหากคุณทำตามลำดับการปรับแต่งเหมือนในบทความ คุณจะไม่เห็นคำเตือนนี้

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

หมายเหตุ: ในเวอร์ชันใหม่ ขนาด Binlog เริ่มต้นคือ 1G และคำเตือนนี้จะไม่เกิดขึ้น

Max_binlog_size = 1G log_bin = /var/log/mysql/mysql-bin.log server-id=master-01 binlog-format = "ROW"

  • max_binlog_size . กำหนดว่าบันทึกไบนารีจะมีขนาดใหญ่เพียงใด พวกเขาบันทึกธุรกรรมและคำขอของคุณและทำ จุดควบคุม- หากธุรกรรมเกินขนาดสูงสุด บันทึกอาจมีขนาดเกินเมื่อบันทึกลงดิสก์ มิฉะนั้น MySQL จะรองรับภายในขีดจำกัดนี้
  • log_bin. ตัวเลือกนี้เปิดใช้งานการบันทึกแบบไบนารีโดยทั่วไป หากไม่มีสิ่งนี้ สแนปช็อตหรือการจำลองแบบก็เป็นไปไม่ได้ โปรดทราบว่าสิ่งนี้อาจส่งผลกระทบอย่างมากต่อพื้นที่ดิสก์ของคุณ server-id เป็นตัวเลือกที่จำเป็นเมื่อเปิดใช้งานการบันทึกแบบไบนารี ดังนั้นบันทึกจะ "รู้" ว่ามาจากเซิร์ฟเวอร์ใด (สำหรับการจำลองแบบ) และรูปแบบ binlog เป็นเพียงวิธีการเขียนเท่านั้น

อย่างที่เห็น, MySQL ใหม่มีค่าเริ่มต้นที่เกือบจะพร้อมใช้งานในการผลิต แน่นอนว่าแต่ละแอปพลิเคชันมีความแตกต่างกันและมีลูกเล่นและการปรับแต่งเพิ่มเติมที่นำไปใช้

MySQL จูนเนอร์

เครื่องมือสนับสนุน: Percona Toolkit สำหรับระบุดัชนีที่ซ้ำกัน

Percona Toolkit ที่เราติดตั้งไว้ก่อนหน้านี้ยังมีเครื่องมือสำหรับตรวจจับดัชนีที่ซ้ำกัน ซึ่งอาจมีประโยชน์เมื่อใช้ CMS ของบุคคลที่สาม หรือเพียงตรวจสอบตัวเองว่าคุณเพิ่มดัชนีมากเกินไปโดยไม่ได้ตั้งใจหรือไม่ ตัวอย่างเช่น, การติดตั้งเวิร์ดเพรสโดยค่าเริ่มต้นมีดัชนีซ้ำกันในตาราง wp_posts:

Pt-duplicate-key-checker h=localhost,u=homestead,p=secret # ############################### ########################################## # homestead.wp_posts # #### ################################################### ################## # คีย์ type_status_date ลงท้ายด้วยคำนำหน้าของดัชนีคลัสเตอร์ # คำจำกัดความของคีย์: # KEY `type_status_date` (`post_type`,`post_status`,`post_date` ,`ID`), # PRIMARY KEY (`ID`), # ประเภทคอลัมน์: # `post_type` varchar(20) เปรียบเทียบ utf8mb4_unicode_520_ci ไม่ใช่ค่าเริ่มต้นที่เป็นค่าว่าง "post" # `post_status` varchar(20) เปรียบเทียบ utf8mb4_unicode_520_ci ไม่ใช่ค่าเริ่มต้นที่เป็นค่าว่าง "เผยแพร่ " " # `post_date` datetime ไม่ใช่ค่าเริ่มต้นที่เป็นโมฆะ "0000-00-00 00:00:00" # `id` bigint(20) ไม่ได้ลงนาม ไม่ใช่ null auto_increation # หากต้องการย่อดัชนีคลัสเตอร์ที่ซ้ำกันนี้ให้สั้นลง ให้ดำเนินการ: ALTER TABLE `homestead` ` wp_posts` DROP INDEX `type_status_date`, เพิ่ม INDEX `type_status_date` (`post_type`,`post_status`,`post_date`);

ดังที่คุณเห็นจากบรรทัดสุดท้าย เครื่องมือนี้ยังให้คำแนะนำเกี่ยวกับวิธีกำจัดดัชนีที่ซ้ำกันอีกด้วย

เครื่องมือช่วยเหลือ: Percona Toolkit สำหรับดัชนีที่ไม่ได้ใช้

Percona Toolkit ยังสามารถตรวจจับดัชนีที่ไม่ได้ใช้ได้อีกด้วย หากคุณกำลังเข้าสู่ระบบ แบบสอบถามช้า(ดูส่วนคอขวดด้านล่าง) คุณสามารถเรียกใช้ยูทิลิตีได้และจะตรวจสอบว่าแบบสอบถามเหล่านี้ใช้ดัชนีบนตารางหรือไม่และอย่างไร

Pt-index-การใช้งาน /var/log/mysql/mysql-slow.log

สำหรับข้อมูลโดยละเอียดเกี่ยวกับการใช้ยูทิลิตี้นี้ โปรดดูที่

สถานที่แคบ

ในส่วนนี้อธิบายวิธีการตรวจหาและตรวจสอบปัญหาคอขวดของฐานข้อมูล

ขั้นแรก เรามาเปิดใช้งานการบันทึกการสืบค้นที่ช้า:

Slow_query_log = /var/log/mysql/mysql-slow.log long_query_time = 1 บันทึกแบบสอบถามไม่ได้ใช้ดัชนี = 1

ต้องเพิ่มบรรทัดด้านบนในการกำหนดค่า mysql ฐานข้อมูลจะติดตามคำค้นหาที่ใช้เวลาดำเนินการมากกว่า 1 วินาทีและคำค้นหาที่ไม่ได้ใช้ดัชนี

เมื่อมีข้อมูลบางส่วนในบันทึกนี้ คุณสามารถวิเคราะห์ข้อมูลดังกล่าวเพื่อใช้ดัชนีโดยใช้ยูทิลิตี pt-index-usage ด้านบน หรือใช้ pt-query-digest ซึ่งจะให้ผลลัพธ์ดังนี้:

Pt-query-digest /var/log/mysql/mysql-slow.log # เวลาผู้ใช้ 360ms, เวลาระบบ 20ms, 24.66M rss, 92.02M vsz # วันที่ปัจจุบัน: พฤหัสบดี 13 ก.พ. 22:39:29 2014 # ชื่อโฮสต์: * # ไฟล์: mysql-slow.log # โดยรวม: ทั้งหมด 8 รายการ, 6 รายการที่ไม่ซ้ำกัน, 1.14 QPS, การทำงานพร้อมกัน 0.00 เท่า ________________ # ช่วงเวลา: 2014-02-13 22:23:52 ถึง 22:23:59 # รวมแอตทริบิวต์ ขั้นต่ำสูงสุดเฉลี่ย 95% ค่ามัธยฐาน stddev # ============ ======= ======= ======= ======= ==== === ======= ======= # เวลาดำเนินการ 3ms 267us 406us 343us 403us 39us 348us # เวลาล็อค 827us 88us 125us 103us 119us 12us 98us # แถวที่ส่ง 36 1 15 4.50 14.52 4.18 3.89 # แถว ส สอบ 87 4 30 10.88 28.75 7.37 7.70 # ขนาดแบบสอบถาม 2.15k 153 296 245.11 284.79 48.90 258.32 # ==== ==== ========= ==== ===== ==== == ===== =============== # โปรไฟล์ # อันดับ Query ID เวลาตอบสนอง โทร R/Call V/M รายการ # ==== ==== === ========= ===== ====== == === =============== # 1 0x728E539F7617C14D 0.0011 41.0% 3 0.0004 0.00 เลือก blog_article # 2 0x1290EEE0B201F3FF 0.0003 12.8% 1 0.0003 0.00portfolio_item # 3 0x31DE4535BDBFA465 0.0003 12.6% 1 0.0003 0.00 เลือกportfolio_item # 4 A5742 0.0003 12.1% 1 0.0003 0.00 เลือก port_category # 5 0x8F848005A09C9588 0.0003 11.8% 1 0.0003 0.00 เลือก blog_category # 6 0x5 5F49C753CA2ED64 9.7 % 1 0.0003 0.00 SELECT blog_article # ==== =========== ======= ============= ===== === === ===== ============== = # แบบสอบถาม 1: 0 QPS, 0x การทำงานพร้อมกัน, ID 0x728E539F7617C14D ที่ไบต์ 736 ______ # คะแนน: V/M = 0.00 # ช่วงเวลา : เหตุการณ์ทั้งหมดเกิดขึ้นที่ 13-02-2014 22:23:52 # คุณลักษณะ pct รวมขั้นต่ำสูงสุดเฉลี่ย 95% ค่ามัธยฐาน stddev # ============ === ======= = ====== ======= ======= == ===== ======= ======= # นับ 37 3 # เวลาดำเนินการ 40 1ms 352us 406us 375us 403us 22us 366us # เวลาล็อค 42 351us 103us 125us 117us 119us 9us 119us # แถวที่ส่ง 25 9 1 4 3 3.89 1.37 3.89 # แถวตรวจสอบ 24 21 5 8 7 7.70 9 7.70 # ขนาดแบบสอบถาม 47 1.02k 261 262 261.25 258.32 0 258.32 # สตริง: # โฮสต์ localhost # ผู้ใช้ * # การกระจาย Query_time # 1us # us#100us### ########################### ###################### ########### # 1ms # 10ms # 100ms # 1s # 10s+ # ตาราง # แสดงสถานะตารางเช่น "blog_article"\G # SHOW CREATE TABLE `blog_article`\G # EXPLAIN /*!50100 PARTITIONS* / SELECT b0_.id AS id0, b0_.slug AS slug1, b0_.title AS title2, b0_.excerpt AS excerpt3, b0_. external_link AS external_link4, b0_.คำอธิบาย AS description5, b0_.สร้าง AS สร้างแล้ว 6, b0_.อัปเดต AS อัปเดต7 จาก blog_article b0_ เรียงลำดับตาม b0_.สร้าง DESC จำกัด 10

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

Mysqldumpslow /var/log/mysql/mysql-slow.log

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

Mysqldumpslow -t 10 -s ที่ /var/log/mysql/localhost-slow.log

บทสรุป

ในโพสต์การเพิ่มประสิทธิภาพ MySQL ที่ครอบคลุมนี้ เราได้กล่าวถึงแล้ว วิธีการต่างๆและเทคนิคที่เราสามารถทำให้ MySQL ของเราบินได้

เราค้นหาการเพิ่มประสิทธิภาพการกำหนดค่า เราอัปเกรดดัชนี และกำจัดบางส่วนออกไป คอขวด- ทั้งหมดนี้เป็นเพียงทฤษฎีเท่านั้น อย่างไรก็ตาม ทั้งหมดนี้ใช้ได้กับการใช้งานในโลกแห่งความเป็นจริง

จากผู้เขียน:เพื่อนคนหนึ่งของฉันตัดสินใจเพิ่มประสิทธิภาพรถของเขา ก่อนอื่นเขาถอดล้อออกหนึ่งล้อจึงตัดหลังคาออก จากนั้นก็ตัดเครื่องยนต์... โดยทั่วไปตอนนี้เขาเดินแล้ว ทั้งหมดนี้ล้วนเป็นผลมาจากแนวทางที่ผิด! ดังนั้น เพื่อให้ DBMS ของคุณทำงานต่อไปได้ การเพิ่มประสิทธิภาพ MySQL จะต้องดำเนินการอย่างถูกต้อง

ควรเพิ่มประสิทธิภาพเมื่อใดและเพราะเหตุใด

มันไม่คุ้มที่จะเข้าไปที่การตั้งค่าเซิร์ฟเวอร์และเปลี่ยนค่าพารามิเตอร์อีกครั้ง (โดยเฉพาะถ้าคุณไม่รู้ว่าสิ่งนี้จะจบลงอย่างไร) หากเราพิจารณาหัวข้อนี้จาก "หอระฆัง" ในการปรับปรุงประสิทธิภาพของทรัพยากรบนเว็บแสดงว่าหัวข้อนี้กว้างขวางมากจนต้องทุ่มเทให้กับทั้งหมด สิ่งพิมพ์ทางวิทยาศาสตร์ใน 7 เล่ม

แต่เห็นได้ชัดว่าฉันไม่มีความอดทนแบบนั้นในฐานะนักเขียน และคุณในฐานะผู้อ่านก็เช่นกัน เราจะทำให้มันง่ายขึ้นและพยายามเจาะลึกถึงขอบเขตของการเพิ่มประสิทธิภาพเพียงเล็กน้อยเท่านั้น เซิร์ฟเวอร์ MySQLและส่วนประกอบของมัน โดยใช้ การติดตั้งที่เหมาะสมที่สุดพารามิเตอร์ DBMS ทั้งหมดสามารถบรรลุเป้าหมายหลายประการ:

เพิ่มความเร็วของการดำเนินการค้นหา

ส่งเสริม ประสิทธิภาพโดยรวมเซิร์ฟเวอร์

ลดเวลาในการรอโหลดหน้าทรัพยากร

ลดการใช้ความจุของเซิร์ฟเวอร์โฮสติ้ง

ลดจำนวนพื้นที่ที่คุณครอบครอง พื้นที่ดิสก์.

เราจะพยายามแบ่งหัวข้อการเพิ่มประสิทธิภาพทั้งหมดออกเป็นหลายจุด เพื่อให้ชัดเจนไม่มากก็น้อยว่าอะไรทำให้ "หม้อเดือด"

ทำไมต้องตั้งค่าเซิร์ฟเวอร์

ใน MySQL การเพิ่มประสิทธิภาพการทำงานควรเริ่มต้นจากเซิร์ฟเวอร์ ก่อนอื่น คุณควรเร่งการดำเนินการและลดเวลาที่ใช้ในการประมวลผลคำขอ การเยียวยาแบบสากลเพื่อให้บรรลุเป้าหมายทั้งหมดข้างต้นคือการเปิดใช้งานการแคช ไม่รู้ว่า “มันคืออะไร”? ตอนนี้ฉันจะอธิบายทุกอย่าง

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

ใน MySQL การเพิ่มประสิทธิภาพคิวรีใช้ได้กับกลไกและ CMS ที่ทำงานบนพื้นฐานของ DBMS และ PHP นี้ ในกรณีนี้โค้ดที่เขียนด้วยภาษาโปรแกรมเพื่อสร้าง หน้าเว็บแบบไดนามิกขอชิ้นส่วนโครงสร้างและเนื้อหาบางส่วน (บันทึก เอกสารสำคัญ และอนุกรมวิธานอื่น ๆ ) จากฐานข้อมูล

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

เปิดใช้งานและกำหนดค่าการแคช

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

มันเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง

มาทำกัน รีวิวเล็กๆ น้อยๆค่าที่ได้รับซึ่งจะเป็นประโยชน์สำหรับเราในการเพิ่มประสิทธิภาพฐานข้อมูล MySQL:

have_query_cache – ค่าระบุว่าแคชการสืบค้นเป็น "เปิด" หรือไม่

query_cache_type - แสดงประเภทแคชที่ใช้งานอยู่ เราต้องการค่า "ON" สิ่งนี้บ่งชี้ว่าแคชถูกเปิดใช้งานสำหรับการเลือกทุกประเภท (คำสั่ง SELECT) ยกเว้นที่ใช้พารามิเตอร์ SQL_NO_CACHE (ห้ามไม่ให้บันทึกข้อมูลเกี่ยวกับแบบสอบถามนี้)

เรามีการตั้งค่าทั้งหมดอย่างถูกต้อง

เราวัดแคชสำหรับดัชนีและคีย์

ตอนนี้คุณต้องตรวจสอบว่ามีการจัดสรรเท่าใด หน่วยความจำเข้าถึงโดยสุ่มสำหรับดัชนีและคีย์ ขอแนะนำให้ตั้งค่าพารามิเตอร์นี้ซึ่งสำคัญสำหรับการเพิ่มประสิทธิภาพฐานข้อมูล MySQL เป็น 20-30% ของจำนวน RAM ที่มีให้กับเซิร์ฟเวอร์ ตัวอย่างเช่น หากจัดสรรพื้นที่ 4 “เฮกตาร์” สำหรับอินสแตนซ์ DBMS คุณก็ตั้งค่าได้ 32 “เมตร” แต่ทั้งหมดขึ้นอยู่กับลักษณะของฐานข้อมูลเฉพาะและโครงสร้าง (ประเภท) ของตาราง

หากต้องการตั้งค่าพารามิเตอร์ คุณต้องแก้ไขเนื้อหา ไฟล์การกำหนดค่า my.ini ซึ่งในเดนเวอร์อยู่ที่เส้นทางต่อไปนี้: F:\Webserver\usr\local\mysql-5.5

เปิดไฟล์โดยใช้ Notepad จากนั้นเราจะค้นหาพารามิเตอร์ key_buffer_size และตั้งค่าขนาดที่เหมาะสมที่สุดสำหรับระบบพีซีของคุณ (ขึ้นอยู่กับ RAM “เฮกตาร์”) หลังจากนี้ คุณจะต้องรีสตาร์ทเซิร์ฟเวอร์ฐานข้อมูล

DBMS ใช้ระบบย่อยเพิ่มเติมหลายระบบ ( ระดับต่ำ) และการตั้งค่าพื้นฐานทั้งหมดก็ระบุไว้ในนั้นด้วย ไฟล์นี้การกำหนดค่า ดังนั้น หากคุณต้องการเพิ่มประสิทธิภาพ MySQL InnoDB ยินดีต้อนรับที่นี่ เราจะศึกษาหัวข้อนี้โดยละเอียดยิ่งขึ้นในเอกสารฉบับถัดไปของเรา

การวัดระดับของดัชนี

การใช้ดัชนีในตารางจะเพิ่มความเร็วในการประมวลผลและสร้างการตอบสนอง DBMS ให้กับแบบสอบถามที่ป้อนอย่างมาก MySQL “วัด” ระดับของดัชนีและการใช้งานคีย์ในแต่ละฐานข้อมูลอย่างต่อเนื่อง สำหรับการได้รับ มูลค่าที่กำหนดใช้แบบสอบถาม:

แสดงสถานะเช่น "handler_read%"

แสดงสถานะเช่น "handler_read%"

ในผลลัพธ์ที่ได้ เราสนใจค่าในบรรทัด Handler_read_key หากตัวเลขที่ระบุมีจำนวนน้อย แสดงว่าแทบไม่เคยมีการใช้ดัชนีในฐานข้อมูลนี้เลย และนี่ก็แย่ (เหมือนเรา)

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

เหตุใดจึงต้องปรับการสืบค้นฐานข้อมูลให้เหมาะสม

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

ก็จะไม่กระทบกระเทือนต่อเว็บมาสเตอร์ที่ใช้ ระบบที่รู้จักการบริหารและชอบที่จะเชื่อมต่อปลั๊กอินทุกประเภท นักพัฒนาบุคคลที่สามพร้อมทั้งปรับแต่งธีมให้กับตัวเอง เช่น ธีมยอดนิยม ซีเอ็มเอสฟรี– เวิร์ดเพรส.

การดำเนินการบางอย่างสามารถทำได้ วิธีทางที่แตกต่างตัวอย่างเช่น คุณสามารถนับจำนวนระเบียนที่พบในตารางโดยใช้ฟังก์ชัน mysql_num_rows (แต่ไม่แนะนำ) หรือคุณสามารถใช้โครงสร้าง SELECT COUNT() ก็ได้ เราทำการศึกษาเป็นการส่วนตัวโดยได้สร้างตารางข้อมูลขนาดใหญ่ที่ประกอบด้วยบันทึกหลายแสนรายการและมีน้ำหนักมากกว่าหนึ่งกิกะไบต์ จากนั้นจึงพยายามนับจำนวนแถวโดยใช้วิธีการที่ระบุ

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

เช่นเดียวกับการออกแบบอื่น ๆ การดำเนินการฐานข้อมูลบางอย่างสามารถทำได้ในสอง, สาม, สี่วิธีขึ้นไป และแต่ละวิธีจะมีความเร็วแตกต่างกัน ในขณะที่ผลลัพธ์ในทุกกรณีจะถูกต้องเท่าเทียมกัน

วิธีเพิ่มประสิทธิภาพการสืบค้นฐานข้อมูล

เพื่อให้เข้าใจอย่างชัดเจนถึงวิธีการเพิ่มประสิทธิภาพการสืบค้น และโครงสร้างใดทำงานเร็วกว่าและโครงสร้างใดช้ากว่า เราจะทำการทดสอบเล็กๆ อีกครั้งและดำเนินการทันที

เราจะต้องหันไปใช้อินเทอร์เฟซของ phpmyadmin ยอดนิยมและสะดวกมากเพื่อขอความช่วยเหลือ ในการเริ่มต้น เราต้องเลือกฐานข้อมูลใดฐานข้อมูลหนึ่งที่มีอยู่และสร้างตารางทดสอบในนั้น ชื่อในกรณีของเราจะค่อนข้างซ้ำซาก - ทดสอบ

สร้างตาราง `ทดสอบ` (`ID` INT ไม่เป็นโมฆะ AUTO_INCREMENT , `TITLE` VARCHAR(100) ชุดอักขระ utf8 COLLATE utf8_unicode_ci ไม่เป็น NULL , `ชุดข้อความประกาศ utf8 COLLATE utf8_unicode_ci ไม่เป็น NULL , `TEXT` ชุดข้อความ utf8 COLL ATE utf8_unicode_ci ไม่ NULL, คีย์หลัก (`ID`)) เครื่องยนต์ = MYISAM ;

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

  • หัวเรื่อง
  • ประกาศ
  • ข้อความเต็ม

สำหรับข้อความนามธรรม เราจะไปที่บริการ Yandex.Abstracts ซึ่งสร้างขึ้นเพื่อวัตถุประสงค์ดังกล่าวโดยเฉพาะ เราโชคดีมากที่มาสะดุดกับหัวข้อ “โฟตอนแรงบิดในศตวรรษที่ 21” เรามาเริ่มกันเลย

เราสุ่มเลือกหัวข้อเป็นชื่อเรื่อง ใช้ข้อความขนาดปานกลางหนึ่งย่อหน้าเป็นประกาศ และ ข้อความเต็มบทความเราจะมีข้อความยาว 4000 ตัวอักษรพร้อมช่องว่าง ในการนับจำนวนตัวอักษรในข้อความ เราใช้ของเรา บริการของตัวเองและเราขอแนะนำให้คุณนับมันด้วย เพราะ... มีตัวเลือกให้คำนึงถึงพื้นที่บัญชีหรือไม่

เราจะไม่คัดลอกคำขอผลลัพธ์ที่นี่ เนื่องจากจะมีความยาวไม่เกิน 4,000 อักขระ ข้อความที่ไม่ซ้ำใครนำมาจากยานเดกซ์ซึ่งค่อนข้างหน้าด้านและคุณก็ไม่ต้องการมันเช่นกัน เรามาวาดรูปกันดีกว่า วงจรที่ง่ายที่สุดใน PHP ซึ่งจะเพิ่มบันทึกลงในฐานข้อมูลได้มากเท่าที่เราต้องการอย่างรวดเร็ว เริ่มต้นด้วย 100,000 บทความ

การสืบค้นฐานข้อมูลน้อยลงก็ยิ่งดีเท่านั้น

ในขั้นตอนนี้เราจะแสดงให้คุณเห็นถึงข้อผิดพลาดทั่วไปซึ่งตอนนี้เราเองก็จงใจทำ

สำหรับ($i=1;$i<100000;$i++) { mysql_query("INSERT INTO `test` (`ID`, `TITLE`, `ANNOUNCEMENT`, `TEXT`) VALUES (NULL, "Заголовок", "Анонс", "Полный текст")"); }

ตามคำขอ เราได้วางโค้ดที่คัดลอกมาจาก phpmyadmin ซึ่งแสดงบนหน้าจอหลังจากเพิ่มบทความแรกด้วยตนเองหนึ่งครั้ง ฉันอยากจะชี้ให้เห็นทันทีว่าคุณไม่ควรสร้างแบบสอบถามไปยังฐานข้อมูลด้วยวิธีนี้ เราทำสิ่งนี้เพียงเพราะเราต้องการเติมข้อมูลแบบสุ่มลงในตารางอย่างรวดเร็ว และแบบสอบถามนี้เขียนได้เร็วกว่าแบบสอบถามที่เหมาะสมที่สุด ในรอบนี้เราจบลงด้วยการเรียกฐานข้อมูลแยกกัน 99,999 ครั้ง (ครั้งแรกที่เราทำด้วยตนเองจาก phpmyadmin) ซึ่งเป็นรูปแบบที่แย่มาก

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

แทรกลงใน `test` (`ID`, `TITLE`, `ประกาศ`, `TEXT`) ค่า (NULL, "หัวข้อ", "ประกาศ", "ข้อความแบบเต็ม"), (NULL, "หัวข้อ", "ประกาศ" , "ข้อความแบบเต็ม"), (NULL, "หัวข้อ", "ประกาศ", "ข้อความแบบเต็ม"), ...

ถ้าเรากลับมาที่วิธีแรกของเรา มันจะมีลักษณะดังนี้:

INSERT INTO `test` (`ID`, `TITLE`, `ANNOUNCEMENT`, `TEXT`) ค่า (NULL, "Title", "ประกาศ", "Full text") INSERT INTO `test` (`ID`, ` TITLE`, `ประกาศ`, `TEXT`) ค่า (NULL, "หัวข้อ", "ประกาศ", "ข้อความแบบเต็ม") INSERT INTO `test` (`ID`, `TITLE`, `ANNOUNCEMENT`, `TEXT`) ค่า (NULL, "หัวข้อ", "ประกาศ", "ข้อความเต็ม") ...

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

เลือกเฉพาะฟิลด์ที่สคริปต์ต้องการ

ทุกอย่างง่ายมากที่นี่ - ฟังก์ชันนี้หรือฟังก์ชันนั้นต้องการข้อมูลบางอย่างจากตารางเป้าหมาย บ่อยครั้งที่ปรากฎว่าคุณต้องลบฟิลด์ทั้งหมดออกทั้งหมด โดยเฉพาะอย่างยิ่งหากตารางมีขนาดค่อนข้างใหญ่และมีฟิลด์เหล่านี้มากกว่า 10 ฟิลด์

เลือก * จาก 'ทดสอบ'

ในแบบสอบถามนี้ เครื่องหมายดอกจันหมายความว่าข้อมูลจะถูกดึงมาจากทุกฟิลด์ของตารางทดสอบ จะเกิดอะไรขึ้นถ้ามีช่องเหล่านี้ตั้งแต่ 20-30 ช่องขึ้นไปในตาราง? สคริปต์น่าจะต้องการเพียงบางส่วนเท่านั้นและส่วนที่เหลือทั้งหมดซึ่งจะไม่ถูกนำไปใช้ในทางใดทางหนึ่งจะถูกเลือกอย่างไร้ประโยชน์ การดำเนินการนี้จะช้ากว่าหากคุณระบุเฉพาะฟิลด์ที่คุณต้องการจริงๆ ในขณะนี้ โดยคั่นด้วยเครื่องหมายจุลภาค

เลือก `ID`, `TITLE` จาก 'test'

ในตัวอย่างนี้ เราจะไม่แตะต้องประกาศและข้อความเต็มของบทความเลย ซึ่งจะทำให้สคริปต์เร็วขึ้นอย่างมาก ดังนั้นเราจึงสรุปได้ว่าการปรับแบบสอบถามฐานข้อมูลให้เหมาะสมยังหมายถึงการระบุฟิลด์ที่จำเป็นในการสืบค้นโดยเฉพาะและละทิ้งความเป็นสากลในรูปแบบของเครื่องหมายดอกจัน

รวมคำขอหลายรายการเป็นหนึ่งเดียว

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

นอกจากการเพิ่มแล้ว เทคนิคนี้สามารถและควรใช้เมื่อสุ่มตัวอย่างข้อมูล ตอนนี้ขอยกตัวอย่างที่ง่ายที่สุด ลองนึกภาพว่าคุณมีสองตารางในฐานข้อมูลของคุณ - ตารางแรกเก็บข้อมูลเกี่ยวกับผู้ใช้ที่ลงทะเบียน และตารางที่สองประกอบด้วยบทความที่เขียนโดยผู้ใช้เหล่านี้

สมมติว่าคุณต้องแสดงบทความแบบสุ่มบนหน้าจอและเซ็นชื่อผู้เขียนที่ด้านล่างสุด การเชื่อมต่อระหว่างตารางในกรณีนี้ชัดเจนและเกิดขึ้นจาก ID ผู้ใช้ กล่าวคือ ID ผู้ใช้ในตาราง Users จะต้องสอดคล้องกับช่อง USER_ID ในตารางโพสต์ การเชื่อมต่อนี้เป็นมาตรฐานและทุกคนควรเข้าใจได้ โดยไม่มีข้อยกเว้น

ดังนั้น ในการเลือกบทความแบบสุ่ม คุณจะต้องเขียนแบบสอบถามดังนี้:

$rs_post = mysql_query("SELECT `ID`, `USER_ID`, `TITLE`, `TEXT` FROM `posts` สั่งซื้อโดย RAND() จำกัด 1");

บทความหนึ่งจะถูกสุ่มเลือกจากตารางโพสต์ หลังจากนั้นการกระทำของเราจะมีลักษณะดังนี้:

$row_post = mysql_fetch_assoc($rs_post); $userID = $row_post["USER_ID"];

ตอนนี้ตัวแปร $userID มี ID ผู้ใช้ของผู้ใช้ที่เป็นผู้เขียนบทความนี้ และเพื่อที่จะรับข้อมูลของเขา เช่น NAME (ชื่อ) และ SURNAME (นามสกุล) คุณจะเข้าถึงตารางผู้ใช้และแบบสอบถาม จะมีลักษณะดังนี้:

$rs_user = mysql_query("SELECT `NAME`, `SURNAME` FROM `users` WHERE `ID` = "".$row_post["USER_ID"]."" จำกัด 1");

อย่าลืมใส่ตัวแปรในการสืบค้นด้วยเครื่องหมายคำพูดเดี่ยว โดยเฉพาะอย่างยิ่งเมื่อข้อมูลมาจากภายนอก โดยใช้ GET หรือ POST สิ่งนี้จะสร้างอุปสรรคเพิ่มเติมสำหรับผู้โจมตีและเป็นหนึ่งในมาตรการที่มุ่งป้องกันการแทรก SQL ลองกลับไปที่ตัวอย่างของเรากัน หลังจากทำการร้องขอไปยังฐานข้อมูลแล้วทุกอย่างก็ง่าย - เราได้รับชื่อและนามสกุลและแสดงเป็นลายเซ็นของบทความ ภารกิจเสร็จสมบูรณ์.

แต่แบบสอบถามทั้งสองนี้สามารถปรับให้เหมาะสมเป็นหนึ่งเดียวได้ ในการดำเนินการนี้ เราจะใช้โครงสร้าง LEFT JOIN:

เลือก `โพสต์`.`ID`, `โพสต์`.`USER_ID`, `โพสต์`.`TITLE`, `โพสต์`.`TEXT`, `users`.`NAME`, `users`.`SURNAME` จาก ` โพสต์ ` ซ้าย เข้าร่วม ` ผู้ใช้ ` บน ` โพสต์ `.` USER_ID` = ` ผู้ใช้ `.` ID` สั่งซื้อโดย RAND() จำกัด 1

อย่างที่คุณเห็นไม่มีอะไรซับซ้อนในการออกแบบด้านบนและทุกอย่างก็ใช้งานง่าย สิ่งเดียวที่ฉันอยากจะดึงดูดความสนใจของคุณคือการบ่งชี้อย่างชัดเจนของตารางที่จับคู่กับเขตข้อมูล เนื่องจากมีการเลือกจากหลายตารางพร้อมกัน หากชื่อของบางฟิลด์ตรงกัน คุณควรใช้สิ่งที่เรียกว่านามแฝง mySQL เพื่อไม่ให้สับสนในภายหลังเมื่อแสดงผลลัพธ์

บทสรุป

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

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

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

การติดตั้ง

เราจะโต้ตอบกับฐานข้อมูลผ่านทางอินเตอร์เฟสบรรทัดคำสั่ง sqlite3(CLI) บนลินุกซ์ ทำงานกับ sqlite3 CLI ใน MAC OS และ Windows ดำเนินการในลักษณะเดียวกัน แต่ฉันขอแนะนำให้คุณใช้เวลา 5 นาทีในการติดตั้งเครื่องเสมือนเพื่อไม่ให้คอมพิวเตอร์ของคุณเกะกะด้วยซอฟต์แวร์ที่ไม่จำเป็น

หากต้องการติดตั้ง sqlite3 บน Linux ให้รันคำสั่ง:

sudo apt-get ติดตั้ง sqlite3 libsqlite3-dev

ผลที่ได้คือเครื่องของคุณก็จะมี sqlite3- หากต้องการติดตั้งเครื่องมือนี้ในระบบปฏิบัติการอื่น ให้ทำตามคำแนะนำ หากต้องการเริ่ม sqlite ให้รันคำสั่ง sqlite3 ในคอนโซล ผลลัพธ์ควรเป็นดังนี้:

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

คำสั่งเมตา

คำสั่งเมตา- ออกแบบมาเพื่อสร้างตารางและการดำเนินการด้านการดูแลระบบอื่น ๆ พวกเขาทั้งหมดจบลง จุด- มาดูรายการคำสั่งที่อาจมีประโยชน์กันดีกว่า:

คำสั่งมาตรฐาน

ตอนนี้เรามาดูรายการกันดีกว่า คำสั่งมาตรฐาน sqlite3 ซึ่งออกแบบมาเพื่อโต้ตอบกับฐานข้อมูล คำสั่งมาตรฐานสามารถจำแนกได้เป็นสามกลุ่ม:

  • ข้อมูล คำอธิบาย ภาษา DDL: คำสั่งเพื่อสร้างตาราง แก้ไขและลบฐานข้อมูล ตาราง และอื่นๆ
  • ภาษาการจัดการข้อมูล DML: อนุญาตให้ผู้ใช้จัดการข้อมูล (เพิ่ม/เปลี่ยนแปลง/ลบ)
  • ภาษาแบบสอบถาม DQL: อนุญาตให้ดึงข้อมูล
  • หมายเหตุ: SQLite ยังรองรับคำสั่งอื่นๆ อีกมากมาย ซึ่งสามารถพบได้ในรายการคำสั่งต่างๆ เนื่องจากบทเรียนนี้มีไว้สำหรับผู้เริ่มต้น เราจะจำกัดตัวเองให้อยู่ในชุดคำสั่งที่ระบุไว้

    ไฟล์ฐานข้อมูล SQLite ได้แก่ ข้ามแพลตฟอร์ม- สามารถพบได้บนอุปกรณ์ประเภทต่างๆ

    • อีเมล
    • ความคิดเห็น

    ในฟิลด์ทั้งหมดนี้ เฉพาะที่อยู่ไซต์เท่านั้นที่สามารถเว้นว่างได้ เรายังแนะนำคอลัมน์สำหรับใส่ลำดับความคิดเห็นได้ด้วย เรียกมันว่า post_id กันดีกว่า

    ตอนนี้เรามากำหนดประเภทข้อมูลสำหรับแต่ละคอลัมน์กันดีกว่า:

    คุณลักษณะ ประเภทข้อมูล
    post_id จำนวนเต็ม
    ชื่อ ข้อความ
    อีเมล ข้อความ
    เว็บไซต์_url ข้อความ
    ความคิดเห็น ข้อความ

    คุณจะสามารถค้นหาข้อมูลทุกประเภทที่รองรับใน SQLite3

    ควรสังเกตว่าใน SQLite3 ข้อมูลที่แทรกลงในคอลัมน์อาจแตกต่างจากประเภทที่ระบุ สิ่งนี้จะไม่ทำงานใน MySQL

    ตอนนี้เรามาสร้างฐานข้อมูลกันดีกว่า หากคุณยังคงอยู่ในอินเทอร์เฟซ sqlite3 ให้พิมพ์ command.quit เพื่อออก ตอนนี้ป้อน:

    sqlite3 comment_section.db

    ด้วยเหตุนี้เราจะมีไฟล์ในไดเร็กทอรีปัจจุบัน comment_section.db.

    หมายเหตุ: หากคุณไม่ระบุชื่อไฟล์ sqlite3 จะสร้างฐานข้อมูลชั่วคราว

    การสร้างตาราง

    ในการจัดเก็บความคิดเห็น เราจำเป็นต้องสร้างตาราง เรียกมันว่าความคิดเห็น เราดำเนินการคำสั่ง:

    สร้างความคิดเห็นของตาราง (post_id INTEGER ไม่ใช่ NULL การเพิ่มคีย์หลักโดยอัตโนมัติ, ชื่อข้อความไม่เป็นโมฆะ, ข้อความอีเมลไม่เป็นโมฆะ, เว็บไซต์ _url TEXT NULL, ความคิดเห็นข้อความไม่เป็นโมฆะ);

    NOT NULL จะช่วยให้แน่ใจว่าเซลล์ไม่มีค่าว่าง คีย์หลักและการเพิ่มอัตโนมัติจะขยายขีดความสามารถของฟิลด์ post_id.

    หากต้องการตรวจสอบว่าตารางถูกสร้างขึ้นแล้ว ให้รันคำสั่ง .tables meta ด้วยเหตุนี้เราจึงเห็นตารางความคิดเห็นของเรา

    หมายเหตุ: หากต้องการดูโครงสร้างตาราง ให้พิมพ์ .schema comment

    ตอนนี้เราสามารถป้อนข้อมูลลงในตารางได้แล้ว

    การแทรกแถว

    สมมติว่าเราจำเป็นต้องสร้างรายการต่อไปนี้:

    ชื่อ: ชีวาม มัมเกน อีเมล์: [ป้องกันอีเมล]เว็บไซต์: shivammg.blogspot.com ความคิดเห็น: บทช่วยสอนที่ยอดเยี่ยมสำหรับผู้เริ่มต้น

    ในการแทรกเราจะใช้คำสั่ง แทรก.

    แทรกความคิดเห็น (ชื่อ, อีเมล, website_url, ความคิดเห็น) ค่า ("Shivam Mamgain", " [ป้องกันอีเมล]", "shivammg.blogspot.com", "บทช่วยสอนที่ยอดเยี่ยมสำหรับผู้เริ่มต้น");

    ไม่จำเป็นต้องระบุค่าสำหรับ post_id เนื่องจาก มันจะถูกสร้างขึ้นโดยอัตโนมัติด้วยการตั้งค่า AUTOINCREMENT

    หากต้องการเติมมือของคุณ คุณสามารถแทรกอีกสองสามบรรทัดได้

    ตัวอย่าง

    ในการดึงข้อมูลเราจะใช้คำสั่ง เลือก.

    เลือก post_id, ชื่อ, อีเมล, website_url, ความคิดเห็นจากความคิดเห็น;

    คำขอเดียวกันอาจมีลักษณะดังนี้:

    SELECT * จากความคิดเห็น;

    เป็นผลให้แถวทั้งหมดจะถูกแยกออกจากตาราง ผลลัพธ์อาจปรากฏขึ้นโดยไม่มีการคั่นคอลัมน์และไม่มีส่วนหัว เพื่อแก้ไขปัญหานี้ เราทำ:

    หากต้องการแสดงส่วนหัว ให้ป้อน .headers ON

    หากต้องการแสดงคอลัมน์ ให้รันคำสั่ง .mode column

    เราดำเนินการ เลือกขออีกครั้ง.

    หมายเหตุ: สามารถเปลี่ยนประเภทการแสดงผลได้โดยใช้คำสั่ง .mode meta

    อัปเดต

    สมมติว่าสนามนั้น อีเมลสำหรับผู้ใช้ 'Shivam Mamgain' จะต้องเปลี่ยนเป็น ' [ป้องกันอีเมล]- เรารันคำสั่งต่อไปนี้:

    ส่งผลให้รายการมีการเปลี่ยนแปลง

    หมายเหตุ: ค่าคอลัมน์ ชื่ออาจไม่ซ้ำกัน ดังนั้น มากกว่าหนึ่งแถวจึงอาจได้รับผลกระทบจากคำสั่ง สำหรับผู้ใช้ทุกคนที่มีค่า ชื่อ= ‘ศิวัม มัมเกน’, ฟิลด์ อีเมลจะถูกเปลี่ยนเป็น ' [ป้องกันอีเมล]- หากต้องการเปลี่ยนเส้นใดเส้นหนึ่ง คุณต้องติดตามโดยใช้ช่อง post_id- เรากำหนดให้มันเป็นคีย์หลัก ซึ่งจะทำให้มั่นใจถึงความเป็นเอกลักษณ์ของค่า



    มีคำถามหรือไม่?

    แจ้งการพิมพ์ผิด

    ข้อความที่จะส่งถึงบรรณาธิการของเรา: