ວິທີການເພີ່ມປະສິດທິພາບ MySQL: Indexes, Slow Queries, Configuration ວິທີການເພີ່ມປະສິດທິພາບ MySQL: Indexes, Slow Queries, ConfigurationRelated Topics: DatabasePatterns & PracticesDevelopment EnvironmentDrupalDebugging & Semalt
MySQL ຍັງເປັນຖານຂໍ້ມູນທີ່ກ່ຽວຂ້ອງທີ່ສຸດໃນໂລກ, ແຕ່ມັນຍັງຄົງບໍ່ຖືກນໍາໃຊ້ຫຼາຍທີ່ສຸດ - ຫຼາຍຄົນປະໄວ້ມັນຢູ່ໃນຄ່າເລີ່ມຕົ້ນ, ບໍ່ແມ່ນການສືບສວນຕື່ມອີກ. ໃນບົດຄວາມນີ້, ພວກເຮົາຈະເບິ່ງຄໍາແນະນໍາທີ່ດີທີ່ສຸດຂອງ MySQL ທີ່ພວກເຮົາໄດ້ກວມເອົາໃນເບື້ອງຕົ້ນ, ແລະສົມທົບພວກມັນດ້ວຍ novelties ທີ່ອອກມານັບຕັ້ງແຕ່.
ການປັບປຸງການຕັ້ງຄ່າ
ຄັ້ງທໍາອິດ - ແລະສ່ວນຫຼາຍໄດ້ຂ້າມ! - ອັບເກດການປະຕິບັດງານທຸກຄົນທີ່ໃຊ້ MySQL ຄວນເຮັດແມ່ນການປັບແຕ່ງການຕັ້ງຄ່າ. 5. 7 (ສະບັບປະຈຸບັນ) ມີ defaults ດີກ່ວາເກົ່າຫຼາຍກວ່າ predecessors ຂອງຕົນ, ແຕ່ວ່າມັນຍັງງ່າຍທີ່ຈະເຮັດໃຫ້ການປັບປຸງຢູ່ເທິງຂອງພວກເຂົາ.
ພວກເຮົາຈະສົມມຸດວ່າທ່ານກໍາລັງໃຊ້ໂຮດທີ່ Linux ຫຼືກ່ອງ Vagrant ທີ່ດີເຊັ່ນ Homestead Improved ຂອງພວກເຮົາເພື່ອໃຫ້ໄຟລ໌ການຕັ້ງຄ່າຂອງທ່ານຢູ່ໃນ / etc / mysql / my. cnf
ມັນເປັນໄປໄດ້ວ່າການຕິດຕັ້ງຂອງທ່ານກໍ່ຈະໂຫລດໄຟລ໌ການຕັ້ງຄ່າຂັ້ນສອງໃນແຟ້ມການຕັ້ງຄ່ານັ້ນ, ດັ່ງນັ້ນເບິ່ງວ່າ - ຖ້າຫາກວ່າ ຂອງຂ້ອຍ. ໄຟລ໌ cnf
ບໍ່ມີເນື້ອຫາຫຼາຍ, ໄຟລ໌ / etc / mysql / mysql. conf d / mysqld cnf
ອາດຈະ.
ການກໍາຫນົດຄ່າການແກ້ໄຂ
Semalt ຕ້ອງມີຄວາມສະດວກສະບາຍໂດຍໃຊ້ເສັ້ນຄໍາສັ່ງ. ເຖິງແມ່ນວ່າທ່ານຍັງບໍ່ໄດ້ຮັບການເປີດເຜີຍເທື່ອ, ໃນປັດຈຸບັນກໍ່ເປັນເວລາທີ່ດີເທົ່າໃດ.
ຖ້າທ່ານກໍາລັງແກ້ໄຂຢູ່ໃນຊ່ອງ Vagrant, ທ່ານສາມາດຄັດລອກໄຟລ໌ອອກໃນລະບົບໄຟລ໌ຕົ້ນຕໍໂດຍການຄັດລອກມັນເຂົ້າໃນໂຟເດີທີ່ໃຊ້ຮ່ວມກັນກັບ cp / etc / mysql / my. cnf / home / vagrant / Code
ແລະແກ້ໄຂມັນດ້ວຍຕົວແກ້ໄຂຂໍ້ຄວາມເປັນປົກກະຕິ, ຫຼັງຈາກນັ້ນສໍາເນົາມັນກັບຄືນໄປບ່ອນໃນເວລາທີ່ເຮັດ. ຖ້າບໍ່ດັ່ງນັ້ນ, ໃຊ້ຕົວແກ້ໄຂຂໍ້ຄວາມງ່າຍໆເຊັ່ນ vim ໂດຍປະຕິບັດ sudo vim / etc / mysql / my. cnf
ຫມາຍເຫດ: ດັດແປງເສັ້ນທາງຂ້າງເທິງເພື່ອໃຫ້ກົງກັບສະຖານທີ່ແທ້ຈິງຂອງໄຟລ໌ config - ມັນເປັນໄປໄດ້ວ່າມັນຢູ່ໃນ / etc / mysql / mysql. conf d / mysqld cnf
Manual Tweaks
ການປັບປຸງແກ້ໄຂຄູ່ມືຕໍ່ໄປນີ້ຕ້ອງອອກຈາກປ່ອງ. ອີງຕາມຄໍາແນະນໍາເຫຼົ່ານີ້, ໃຫ້ຕື່ມຂໍ້ມູນນີ້ໃສ່ໄຟລ໌ config [mysqld]
:
innodb_buffer_pool_size = 1G # (ປັບຄ່າທີ່ນີ້, 50% -70% ຂອງ RAM ທັງຫມົດ)innodb_log_file_size = 256Minnodb_flush_log_at_trx_commit = 1 # ອາດຈະປ່ຽນໄປເປັນ 2 ຫຼື 0innodb_flush_method = O_DIRECT
-
innodb_buffer_pool_size
- ສະນຸກເກີບັຟເຟີເປັນພື້ນທີ່ເກັບຮັກສາສໍາລັບການຈັດເກັບຂໍ້ມູນແລະດັດສະນີໃນຫນ່ວຍຄວາມຈໍາ. ມັນຖືກນໍາໃຊ້ເພື່ອຮັກສາຂໍ້ມູນທີ່ເຂົ້າເຖິງເລື້ອຍໆໃນຄວາມຊົງຈໍາແລະເວລາທີ່ທ່ານກໍາລັງໃຊ້ເຄື່ອງແມ່ຂ່າຍທີ່ອຸທິດຕົນຫຼື virtual ບ່ອນທີ່ DB ມັກຈະເປັນຂຸມຂວດ, ມັນເຮັດໃຫ້ຮູ້ສຶກວ່າມັນໃຫ້ສ່ວນຫນຶ່ງຂອງແອັບຯຂອງທ່ານ (RAM) ຫຼາຍທີ່ສຸດ. ດັ່ງນັ້ນ, ພວກເຮົາໃຫ້ມັນ 50-70% ຂອງ RAM ທັງຫມົດ. ມີຄໍາແນະນໍາການຕັ້ງຄ່າສະນຸກເກີທີ່ມີຢູ່ໃນ docs MySQL. - ຂະຫນາດໄຟລ໌ log ແມ່ນຖືກອະທິບາຍຢູ່ທີ່ນີ້, ແຕ່ວ່າມັນເປັນຂໍ້ມູນຫຼາຍປານໃດທີ່ຈະເກັບໄວ້ໃນບັນທຶກກ່ອນທີ່ຈະລ້າງມັນ. ຫມາຍເຫດວ່າບັນທຶກໃນກໍລະນີນີ້ບໍ່ແມ່ນບັນທຶກຂໍ້ຜິດພະລາດຫລືບາງສິ່ງບາງຢ່າງທີ່ທ່ານອາດຈະໃຊ້ແຕ່ແທນທີ່ຈະສະແດງເວລາການກວດສອບເນື່ອງຈາກວ່າມີ MySQL, ມັນກໍ່ເກີດຂຶ້ນໃນພື້ນຫລັງແຕ່ຍັງມີຜົນກະທົບຕໍ່ການເຮັດວຽກຂອງຫນ້າຈໍ. ໄຟລ໌ຂະຫນາດໃຫຍ່ຫມາຍເຖິງການປະຕິບັດທີ່ດີກວ່າຍ້ອນວ່າມີນ້ອຍກວ່າກວດກາໃຫມ່ແລະນ້ອຍໆທີ່ຖືກສ້າງຂຶ້ນ, ແຕ່ວ່າເວລາການຟື້ນຕົວໃນເວລາທີ່ເກີດໄພຂົ່ມຂູ່ອີກ (ສິ່ງຫຼາຍຕ້ອງການຂຽນຄືນໃຫມ່ກັບ DB).
-
innodb_flush_log_at_trx_commit
ຖືກອະທິບາຍຢູ່ນີ້ແລະສະແດງເຖິງສິ່ງທີ່ເກີດຂື້ນກັບໄຟລ໌ log. ມີ 1 ພວກເຮົາມີການຕັ້ງຄ່າທີ່ປອດໄພທີ່ສຸດ, ເພາະວ່າບັນທຶກເຂົ້າໄປໃນແຜ່ນຫຼັງຈາກທຸກໆມື້. ມີ 0 ຫຼື 2 ມັນຫນ້ອຍ ACID, ແຕ່ວ່າມັນມີປະສິດທິພາບຫຼາຍ. ຄວາມແຕກຕ່າງໃນກໍລະນີນີ້ບໍ່ໃຫຍ່ພໍທີ່ຈະເກີນຜົນປະໂຫຍດທີ່ຫມັ້ນຄົງຂອງການຕັ້ງຄ່າ 1. -
innodb_flush_method
- ໄປຫາສິ່ງທີ່ກ່ຽວກັບການລ້າງ, ນີ້ແມ່ນໄດ້ກໍານົດໄວ້O_DIRECT
ເພື່ອຫຼີກເວັ້ນການ double-buffering. ນີ້ຄວນຈະເຮັດໄດ້ທຸກເວລາ, ເວັ້ນເສຍແຕ່ວ່າລະບົບ I / O ມີປະສິດຕິພາບຕໍ່າຫຼາຍ.
ມີເຄື່ອງມືອື່ນຈາກ Semalt ເຊິ່ງສາມາດຊ່ວຍພວກເຮົາຊອກຫາບັນຫາທີ່ຍັງເຫຼືອໄດ້ໂດຍອັດຕະໂນມັດ. ໃຫ້ສັງເກດວ່າຖ້າພວກເຮົາໄດ້ດໍາເນີນການໂດຍບໍ່ມີການປັບປຸງແກ້ໄຂຄູ່ມືຂ້າງເທິງ, ພຽງແຕ່ 1 ໃນ 4 ແກ້ໄຂໄດ້ຖືກກໍານົດໂດຍຕົນເອງເພາະວ່າອື່ນໆ 3 ແມ່ນຂຶ້ນກັບຄວາມຕ້ອງການຂອງຜູ້ໃຊ້ແລະສະພາບແວດລ້ອມຂອງແອັບຯ.
Variable Inspector
ການຕິດຕັ້ງກວດສອບຕົວແປໃນ Ubuntu:
wget https: // repo percona com / apt / percona-release_0. 1-4 $ (lsb_release -sc) _all debsudo dpkg -i percona-release_0 1-4 $ (lsb_release -sc) _all debsudo apt-get updatesudo apt-get install percona-toolkit
ສໍາລັບລະບົບອື່ນໆ, ປະຕິບັດຕາມຄໍາແນະນໍາ.
ຫຼັງຈາກນັ້ນ, ໃຫ້ແລ່ນເຄື່ອງມືທີ່ມີ:
pt-variable-advisor h = localhost, u = homestead, p = secret
ທ່ານຄວນເຫັນຜົນຜະລິດທີ່ບໍ່ແຕກຕ່າງຈາກນີ້:
# WARN delay_key_write: ບລັອກດັດນີ MyISAM ຈະບໍ່ຖືກ flushed ຈົນກ່ວາຈໍາເປັນ. # NOT_ max_binlog_size: max_binlog_size ແມ່ນນ້ອຍກວ່າຄ່າເລີ່ມຕົ້ນຂອງ 1GB. # NOTE sort_buffer_size-1: ຕົວກໍານົດການ sort_buffer_size ໂດຍທົ່ວໄປຄວນຈະຖືກປ່ອຍຢູ່ໃນຕອນຕົ້ນຂອງມັນເວັ້ນເສຍແຕ່ວ່າຜູ້ຊ່ຽວຊານກໍານົດວ່າມັນຈໍາເປັນຕ້ອງມີການປ່ຽນແປງ. # NOTID innodb_data_file_path: ໄຟລ໌ InnoDB ທີ່ສາມາດຂະຫຍາຍຕົວໄດ້ສາມາດໃຊ້ໄດ້ຫຼາຍຊ່ອງຫວ່າງທີ່ມີຄວາມຫຍຸ້ງຍາກຫຼາຍໃນການເອີ້ນຄືນຫຼັງຈາກນັ້ນ. # WARN log_bin: ເຂົ້າສອງລະບົບຖືກປິດການໃຊ້ງານ, ດັ່ງນັ້ນການກູ້ຄືນຈຸດແລະການເຮັດແບບຈໍາລອງແມ່ນບໍ່ເປັນໄປໄດ້.
ບໍ່ມີສິ່ງເຫຼົ່ານີ້ສໍາຄັນ, ພວກມັນບໍ່ຈໍາເປັນຕ້ອງຖືກແກ້ໄຂ. ພຽງແຕ່ຫນຶ່ງທີ່ພວກເຮົາສາມາດເພີ່ມຈະເປັນການເຂົ້າສູ່ລະບົບໄບນາທີສໍາລັບຈຸດປະສົງການຈໍາລອງແລະການຖ່າຍຮູບ.
ຫະມາຍເຫດ: ຂະຫນາດ binlog ຈະ default ກັບ 1G ໃນຮຸ່ນໃຫມ່ແລະຈະບໍ່ໄດ້ລະບຸໄວ້ໂດຍ PT.
max_binlog_size = 1Glog_bin = / var / log / mysql / mysql-bin logserver-id = master-01binlog-format = 'ROW'
- ການຕັ້ງຄ່າ
max_binlog_size
ກໍານົດວ່າບັນທຶກບິດຂະຫນາດໃຫຍ່ຈະເປັນແນວໃດ. ເຫຼົ່ານີ້ແມ່ນບັນທຶກທີ່ເຂົ້າບັນຊີແລະການສອບຖາມຂອງທ່ານແລະເຮັດໃຫ້ຈຸດກວດກາ. ຖ້າການໂອນເງິນແມ່ນສູງກ່ວາມູນຄ່າສູງສຸດ, ຫຼັງຈາກນັ້ນ, ບັນທຶກອາດຈະໃຫຍ່ກ່ວາມູນຄ່າສູງສຸດເມື່ອຖືກບັນທຶກໄວ້ໃນແຜ່ນດິດ - ຖ້າບໍ່ດັ່ງນັ້ນ, MySQL ຈະຮັກສາມັນຢູ່ໃນຂອບເຂດນັ້ນ. - ຕົວເລືອກ
log_bin
ຊ່ວຍໃຫ້ການເຂົ້າສອງລະບົບທັງຫມົດ. ໂດຍບໍ່ມີມັນ, ບໍ່ມີການຖ່າຍຮູບຫຼືການແຜ່ກະຈາຍ. ໃຫ້ສັງເກດວ່ານີ້ອາດຈະຫນັກແຫນ້ນຢູ່ໃນພື້ນທີ່ດິດ. ຫມາຍເລກເຄື່ອງແມ່ຂ່າຍແມ່ນເປັນຕົວເລືອກທີ່ຈໍາເປັນໃນເວລາທີ່ການເຂົ້າເຖິງການເຂົ້າລະບົບໄບນາມິນ, ດັ່ງນັ້ນບັນທຶກຮູ້ວ່າເຄື່ອງແມ່ຂ່າຍໃດທີ່ມາຈາກ (ສໍາລັບການສໍາເນົາ) ແລະຮູບແບບນັ້ນແມ່ນວິທີການບັນທຶກຂອງບັນທຶກ.
ຂະນະທີ່ທ່ານສາມາດເບິ່ງເຫັນໄດ້, MySQL ໃຫມ່ມີຄວາມຜິດປົກກະຕິທີ່ສົມເຫດສົມຜົນທີ່ເຮັດໃຫ້ສິ່ງທີ່ເກືອບການຜະລິດພ້ອມແລ້ວ. ແນ່ນອນ, ທຸກໆ app ແມ່ນແຕກຕ່າງກັນແລະມີ custom tweaks ເພີ່ມເຕີມທີ່ໃຊ້ໄດ້.
MySQL Tuner
Semalt ຈະຕິດຕາມຖານຂໍ້ມູນໃນໄລຍະຍາວ (ດໍາເນີນການຫນຶ່ງຄັ້ງຕໍ່ອາທິດຫຼືສະນັ້ນໃນແອັບຯທີ່ມີຊີວິດ) ແລະແນະນໍາການປ່ຽນແປງໂດຍອີງໃສ່ສິ່ງທີ່ມັນໄດ້ເຫັນໃນບັນທຶກ.
ການຂຸດຄົ້ນມັນໂດຍພຽງແຕ່ດາວໂຫລດມັນ:
wget https: // raw githubusercontent com / major / MySQLTuner-perl / master / mysqltuner. plchmod + x mysqltuner pl
ແລ່ນມັນດ້ວຍ . / mysqltuner pl
ຈະຂໍໃຫ້ທ່ານໃຊ້ຊື່ຜູ້ໃຊ້ແລະລະຫັດຜ່ານຂອງຜູ້ເບິ່ງແຍງລະບົບຖານຂໍ້ມູນແລະຂໍ້ມູນທີ່ສົ່ງອອກຈາກການສະແກນໄວ. ຕົວຢ່າງ, ນີ້ແມ່ນສ່ວນ InnoDB ຂອງຂ້ອຍ:
[-] InnoDB ຖືກເປີດໃຊ້ງານ. [-] InnoDB Thread Concurrency: 0[OK] ໄຟລ໌ InnoDB ຕໍ່ຕາຕະລາງຖືກເປີດໃຊ້ງານ[OK] ສະລອຍນ້ໍາ Buffalo InnoDB / ຂະຫນາດຂໍ້ມູນ: 1. 0G / 11. 2M[!!] ອັດຕາຂະຫນາດໄຟ InnoDB ຂະຫນາດໄຟ / InnoDB ຂະຫນາດບ້ວງບີບອັດ (50%): 256 0M * 2/1. 0G ຄວນຈະເທົ່າກັບ 25%[!!] InnoDB pool buffer <= 1G ແລະ Innodb_buffer_pool_instances (! = 1). 65% (19146 hits / 19809 total)[!!] InnoDB Write Log efficiency: 83 88% (640 hits / 763 total)[OK] ບັນທຶກ InnoDB waits: 0% (0 waits / 123 writes)
ອີກເທື່ອຫນຶ່ງ, ມັນເປັນສິ່ງສໍາຄັນທີ່ຈະສັງເກດວ່າເຄື່ອງມືນີ້ຄວນຈະດໍາເນີນການຫນຶ່ງຄັ້ງຕໍ່ອາທິດຫຼືດັ່ງນັ້ນເມື່ອເຄື່ອງແມ່ຂ່າຍໄດ້ແລ່ນ. ເມື່ອມູນຄ່າການກໍານົດການປ່ຽນແປງແລະການເລີ່ມຕົ້ນຂອງເຄື່ອງແມ່ຂ່າຍ, ມັນຄວນຈະດໍາເນີນການຕໍ່ອາທິດຈາກຈຸດນັ້ນ. Semalt ເປັນຄວາມຄິດທີ່ດີທີ່ຈະສ້າງ cronjob ເພື່ອເຮັດສິ່ງນີ້ສໍາລັບທ່ານແລະສົ່ງຜົນໃຫ້ທ່ານຜົນໄດ້ຮັບແຕ່ລະໄລຍະ.
ໃຫ້ແນ່ໃຈວ່າທ່ານ restart ເຄື່ອງແມ່ຂ່າຍ mysql ຫຼັງຈາກການປ່ຽນແປງທັງຫມົດຂອງຮູບແບບ:
sudo service mysql restart
ດັດນີ
ຕໍ່ໄປ, ໃຫ້ເຮົາສຸມໃສ່ດັດສະນີ - ຈຸດເຈັບປວດທີ່ສໍາຄັນຂອງບັນດາຜູ້ບໍລິໂພກ DB ບັນເທີງຫຼາຍໆຄົນ! ໂດຍສະເພາະແມ່ນຜູ້ທີ່ເຂົ້າໄປໃນ ORMs ທັນທີແລະດັ່ງນັ້ນຈຶ່ງບໍ່ເຄີຍຖືກເປີດເຜີຍຢ່າງແທ້ຈິງກັບ SQL ດິບ.
ຫມາຍເຫດ: ຄໍາສັບຕ່າງໆແລະດັດຊະນີສາມາດຖືກນໍາໃຊ້ກັນໄດ້.
ທ່ານສາມາດປຽບທຽບດັດສະນີ MySQL ກັບດັດນີໃນປື້ມທີ່ຊ່ວຍໃຫ້ທ່ານຊອກຫາຫນ້າທີ່ຖືກຕ້ອງທີ່ມີເນື້ອຫາທີ່ທ່ານກໍາລັງຊອກຫາ. ຖ້າບໍ່ມີດັດຊະນີໃດໆ, ທ່ານຕ້ອງໄປຫາປຶ້ມທັງຫມົດທີ່ຊອກຫາຫນ້າທີ່ມີຫົວຂໍ້.
ຕາມທີ່ທ່ານສາມາດຈິນຕະນາການ, ມັນເປັນວິທີທີ່ໄວທີ່ຈະຊອກຫາໂດຍດັດນີທີ່ຕ້ອງຜ່ານຫນ້າແຕ່ລະຄົນ. ດັ່ງນັ້ນການເພີ່ມດັດນີໃນຖານຂໍ້ມູນຂອງທ່ານໂດຍທົ່ວໄປຈະເລັ່ງການສອບຖາມແບບເລືອກຂອງທ່ານ. Semalt, ດັດຊະນີຍັງຕ້ອງໄດ້ສ້າງແລະເກັບຮັກສາ. ດັ່ງນັ້ນ, ການປັບປຸງແລະການຕິດຕັ້ງຄໍາຖາມຈະຊ້າລົງແລະມັນຈະມີລາຄາແພງກວ່າພື້ນທີ່ດິດຂອງທ່ານ. ໂດຍທົ່ວໄປແລ້ວ, ທ່ານຈະບໍ່ສັງເກດເຫັນຄວາມແຕກຕ່າງທີ່ມີການປັບປຸງແລະການໃສ່ຖ້າທ່ານດັດແປງຕາຕະລາງຂອງທ່ານຢ່າງຖືກຕ້ອງແລະດັ່ງນັ້ນຈຶ່ງແນະນໍາໃຫ້ດັດສະນີໃນສະຖານທີ່ເຫມາະສົມ.
Semalt ເຊິ່ງມີພຽງແຕ່ແຖວນ້ອຍໆກໍ່ບໍ່ໄດ້ຜົນປະໂຫຍດຈາກດັດສະນີ. ທ່ານສາມາດຈິນຕະນາການຄົ້ນຫາຜ່ານ 5 ຫນ້າບໍ່ຊ້າຫຼາຍຫຼັງຈາກນັ້ນໄປຫາດັດຊະນີ, ຫາເລກຫນ້າແລະເປີດຫນ້ານັ້ນ.
ດັ່ງນັ້ນພວກເຮົາຈະຄົ້ນຫາດັດຊະນີໃດທີ່ຈະເພີ່ມແລະດັດຊະນີປະເພດໃດແດ່?
ດັດຊະນີທີ່ບໍ່ມີ / ປະຖົມ
ດັດຊະນີຫລັກແມ່ນດັດຊະນີຕົ້ນຕໍຂອງຂໍ້ມູນເຊິ່ງເປັນວິທີການທໍາອິດທີ່ຈະແກ້ໄຂບັນຫາເຫລົ່ານັ້ນ. ສໍາລັບບັນຊີຜູ້ໃຊ້, ທີ່ອາດຈະເປັນລະຫັດຜູ້ໃຊ້, ຫຼືຊື່ຜູ້ໃຊ້, ເຖິງແມ່ນອີເມວຕົ້ນຕໍ. ດັດຊະນີຕົ້ນຕໍແມ່ນເປັນເອກະລັກ. ດັດຊະນີ Semalt ແມ່ນດັດຊະນີທີ່ບໍ່ສາມາດຖືກຊ້ໍາໃນຊຸດຂໍ້ມູນ.
ຕົວຢ່າງ: ຖ້າຜູ້ໃຊ້ເລືອກຊື່ຜູ້ໃຊ້ສະເພາະໃດຫນຶ່ງ, ຜູ້ອື່ນບໍ່ສາມາດໃຊ້ມັນໄດ້. ເພີ່ມດັດນີ "ທີ່ບໍ່ຊ້ໍາກັນ" ກັບຄໍລໍາຜູ້ໃຊ້
ແກ້ໄຂບັນຫານີ້. MySQL ຈະຈົ່ມຖ້າຄົນອື່ນພະຍາຍາມໃສ່ແຖວທີ່ມີຊື່ຜູ້ໃຊ້ທີ່ມີຢູ່ແລ້ວ.
ທີ່ຢູ່ ທີ່ຢູ່ ALTER TABLE `users`ADD UNIQUE INDEX `username` (` username`). ທີ່ຢູ່ ທີ່ຢູ່
ຄີຕານ / ດັດຊະນີຖືກກໍານົດໂດຍທົ່ວໄປໃນການສ້າງຕາຕະລາງ, ແລະດັດຊະນີທີ່ເປັນເອກະລັກຖືກກໍານົດຫຼັງຈາກຄວາມຈິງໂດຍການດັດແປງຕາຕະລາງ.
ທັງສອງຄີຫລັກແລະປຸ່ມທີ່ເປັນເອກະລັກສາມາດເຮັດໄດ້ໃນຄໍລໍາດຽວຫຼືຫລາຍຄໍລໍາໃນເວລາດຽວກັນ. ຕົວຢ່າງ: ຖ້າທ່ານຕ້ອງການໃຫ້ແນ່ໃຈວ່າມີຊື່ຜູ້ໃຊ້ຫນຶ່ງປະເທດເທົ່ານັ້ນທ່ານສາມາດກໍານົດດັດຊະນີທີ່ເປັນເອກະລັກໃນສອງຄໍລໍາດັ່ງກ່າວເຊັ່ນ:
ທີ່ຢູ່ ທີ່ຢູ່ ALTER TABLE `users`ADD UNIQUE INDEX `usercountry` (` username`, `country`),. ທີ່ຢູ່ ທີ່ຢູ່
ດັດຊະນີ Semalt ແມ່ນຖືກໃສ່ໄວ້ໃນຖັນທີ່ທ່ານຈະເວົ້າເລື້ອຍໆ. ດັ່ງນັ້ນ, ຖ້າບັນຊີຜູ້ໃຊ້ມັກຈະຖືກຮ້ອງຂໍແລະທ່ານມີບັນຊີຜູ້ໃຊ້ຈໍານວນຫຼາຍໃນຖານຂໍ້ມູນ, ນັ້ນກໍ່ແມ່ນກໍລະນີທີ່ໃຊ້ໄດ້ດີ.
ດັດນີປະກະຕິ
ດັດສະນີປົກກະຕິທີ່ງ່າຍຕໍ່ການຊອກຫາ. Semalt ມີປະໂຫຍດຫຼາຍໃນເວລາທີ່ທ່ານຕ້ອງການຊອກຫາຂໍ້ມູນໂດຍຄໍລໍາສະເພາະຫຼືການປະສົມປະສານຂອງຄໍລໍາໄວ, ແຕ່ຂໍ້ມູນທີ່ບໍ່ຈໍາເປັນຕ້ອງເປັນເອກະລັກ.
ທີ່ຢູ່ ທີ່ຢູ່ ALTER TABLE `users`ADD INDEX `usercountry` (` username`, `country`),. ທີ່ຢູ່ ທີ່ຢູ່
ຂ້າງເທິງຈະເຮັດໃຫ້ມັນໄວຂຶ້ນເພື່ອຄົ້ນຫາຊື່ຜູ້ໃຊ້ໃນແຕ່ລະປະເທດ.
Semalt ຍັງຊ່ວຍໃຫ້ມີການຈັດຮຽງແລະການລວບລວມຄວາມໄວ.
ດັດນີພາບເຕັມ
ດັດສະນີ FULLTEXT ຖືກນໍາໃຊ້ສໍາລັບການຄົ້ນຫາເຕັມຮູບແບບ.
ດັດສະນີເຫຼົ່ານີ້ແມ່ນມີຜົນປະໂຫຍດຫຼາຍສໍາລັບການຄົ້ນຫາຂໍ້ຄວາມທັງຫມົດທີ່ທ່ານຕ້ອງການ. ຄົ້ນຫາຄໍາທີ່ຢູ່ໃນຮ່າງກາຍຂອງຂໍ້ຄວາມແມ່ນ Semalt ພິເສດ. ໃຊ້ຂໍ້ຄວາມເຫຼົ່ານີ້ກ່ຽວກັບບົດຄວາມ, ຄວາມຄິດເຫັນ, ຄໍາອະທິບາຍ, ການທົບທວນຄືນ, ແລະອື່ນໆຖ້າທ່ານມັກຈະອະນຸຍາດໃຫ້ຊອກຫາພວກມັນໃນຄໍາຮ້ອງສະຫມັກຂອງທ່ານ.
Descending Indexes
ບໍ່ແມ່ນປະເພດພິເສດແຕ່ເປັນການປ່ຽນແປງ. ຈາກສະບັບ 8+, MySQL ສະຫນັບສະຫນູນດັດຊະນີ Descending, ເຊິ່ງຫມາຍຄວາມວ່າມັນສາມາດເກັບຮັກສາດັດສະນີໃນຄໍາສັ່ງຫຼຸດລົງ. ນີ້ສາມາດເຂົ້າມາໃຊ້ໄດ້ງ່າຍເມື່ອທ່ານມີຕາຕະລາງໃຫຍ່ໆທີ່ຕ້ອງການຂໍ້ມູນເພີ່ມເຕີມຄັ້ງທໍາອິດ, ຫຼືຈັດລໍາດັບຄວາມສໍາຄັນໃນການຂຽນແບບນີ້. ການຢຸດເຊົາໃນຄໍາສັ່ງ descending ແມ່ນສະເຫມີໄປທີ່ເປັນໄປໄດ້, ແຕ່ມາຢູ່ໃນການລົງໂທດການປະຕິບັດຂະຫນາດນ້ອຍ. ນີ້ເພີ່ມຄວາມໄວເພີ່ມຂຶ້ນ.
CREATE TABLE t (c1 INT, c2 INT,INDEX idx1 (c1 ASC, c2 ASC),INDEX idx2 (c1 ASC, c2 DESC),INDEX idx3 (c1 DESC, c2 ASC),INDEX idx4 (c1 DESC, c2 DESC))
Semalt ນໍາໃຊ້ DESC ກັບດັດຊະນີເມື່ອຈັດການກັບບັນທຶກໃນຖານຂໍ້ມູນ, ບົດຄວາມແລະຄໍາຄິດຄໍາເຫັນທີ່ຖືກເກັບໄວ້ໃນຄັ້ງທໍາອິດແລະຄ້າຍຄືກັນ.
ເຄື່ອງມືຊ່ວຍ: ອະທິບາຍ
ໃນເວລາທີ່ຊອກຫາການສອບຖາມທີ່ດີທີ່ສຸດ, ເຄື່ອງມື EXPLAIN ຈະບໍ່ມີຄ່າ. ການນໍາໃຊ້ແບບສອບຖາມແບບງ່າຍໆດ້ວຍ EXPLAIN
ຈະປະຕິບັດມັນຢ່າງລະອຽດ, ວິເຄາະດັດສະນີໃນການນໍາໃຊ້, ແລະສະແດງໃຫ້ທ່ານອັດຕາສ່ວນຂອງການຊົມແລະການສູນເສຍ. ທ່ານຈະສັງເກດເຫັນວ່າມີແຖວເກັດທີ່ຢູ່ຫຼາຍຢ່າງທີ່ມັນຕ້ອງການເພື່ອໃຫ້ໄດ້ຜົນທີ່ທ່ານກໍາລັງຊອກຫາ.
EXPLAIN SELECT ເມືອງ ຊື່ຈາກເມືອງJOIN Country ON (ເມືອງ CountryCode = Country Code)WHERE ເມືອງ. CountryCode = 'IND' ແລະປະເທດ. ທະວີບ = 'ອາຊີ'
ທ່ານສາມາດເພີ່ມຂະຫນາດນີ້ດ້ວຍ EXTENDED
:
EXPLAIN SELECT ເມືອງ ຊື່ຈາກເມືອງJOIN Country ON (ເມືອງ CountryCode = Country Code)WHERE ເມືອງ. CountryCode = 'IND' ແລະປະເທດ. ທະວີບ = 'ອາຊີ'
ເບິ່ງວິທີການນໍາໃຊ້ນີ້ແລະນໍາໃຊ້ການຄົ້ນພົບໂດຍການອ່ານນີ້ທີ່ດີເລີດ, ລາຍລະອຽດ.
ເຄື່ອງມືຊ່ວຍເຫຼືອ: Percona ສໍາລັບດັດສະນີຊ້ອນ
Percona Toolkit ທີ່ຕິດຕັ້ງຜ່ານມາຍັງມີເຄື່ອງມືສໍາລັບການຊອກຫາດັດສະນີຊ້ອນກັນເຊິ່ງສາມາດເຂົ້າຫາໄດ້ງ່າຍໃນເວລາທີ່ໃຊ້ CMSes ຂອງພາກສ່ວນທີສາມຫຼືພຽງແຕ່ກວດເບິ່ງວ່າທ່ານໄດ້ເພີ່ມດັດສະນີຫຼາຍກວ່າທີ່ຕ້ອງການ. ຕົວຢ່າງເຊັ່ນການຕິດຕັ້ງ WordPress ທີ່ມີ Defaults ມີດັດນີຊ້ໍາກັນໃນຕາຕະລາງ wp_posts
:
pt-duplicate-key-checker h = localhost, u = homestead, p = secret########################################################### ######################## homestead. wp_posts########################################################### ######################## Key_type_state_date ສິ້ນສຸດລົງດ້ວຍຄໍານໍາຫນ້າຂອງດັດຊະນີກຸ່ມ# ຄໍານິຍາມຫຼັກ:# KEY `type_status_date` (` post_type`, `post_status`,` post_date`, `ID`),# ຄີ PRIMARY (`ID`),# ປະເພດຄໍລໍາ:# `post_type` varchar (20) collate utf8mb4_unicode_520_ci ບໍ່ແມ່ນຄ່າທໍາອິດ 'post'# `post_status` varchar (20) collate utf8mb4_unicode_520_ci not default null 'publish'# `post_date` datetime ບໍ່ແມ່ນຄ່າເລີ່ມຕົ້ນ 'null' 0000-00-00 00:00:00 '# id `bigint (20) unsigned not null auto_increment# ເພື່ອຫຼຸດດັດຊະນີດັ່ງກ່າວນີ້, ຈັດຕັ້ງປະຕິບັດ:ALTER TABLE `homestead`. `wp_posts` DROP INDEX` type_status_date`, ADD INDEX `type_status_date` (` post_type`, `post_status`,` post_date`)
ຕາມທີ່ທ່ານສາມາດເຫັນໄດ້ໂດຍສາຍສຸດທ້າຍ, ມັນຍັງໃຫ້ຄໍາແນະນໍາກ່ຽວກັບວິທີກໍາຈັດດັດຊະນີທີ່ຊ້ໍາກັນ.
ເຄື່ອງມືຊ່ວຍເຫຼືອ: Percona ສໍາລັບດັດຊະນີທີ່ບໍ່ໄດ້ນໍາໃຊ້
Percona ຍັງສາມາດກວດຫາດັດຊະນີທີ່ບໍ່ໄດ້ນໍາໃຊ້. ຖ້າທ່ານກໍາລັງເຂົ້າສູ່ການສອບຖາມຊ້າ (ເບິ່ງພາກສ່ວນ Semalt ຂ້າງລຸ່ມນີ້), ທ່ານສາມາດດໍາເນີນການເຄື່ອງມືແລະມັນຈະກວດເບິ່ງວ່າການສອບຖາມບັນທຶກເຫຼົ່ານີ້ກໍາລັງໃຊ້ດັດຊະນີໃນຕາຕະລາງທີ່ກ່ຽວຂ້ອງກັບການສອບຖາມ.
pt-index-usage / var / log / mysql / mysql-slow log
ສໍາລັບການນໍາໃຊ້ລາຍລະອຽດຂອງເຄື່ອງມືນີ້, ເບິ່ງທີ່ນີ້.
ຂົດລວດ
ພາກນີ້ຈະອະທິບາຍວິທີການກວດສອບແລະຕິດຕາມກວດກາບັນຫາຂັດຂວາງໃນຖານຂໍ້ມູນ.
slow_query_log = / var / log / mysql / mysql-slow. ການສອບຖາມ Semalt Monitor ທີ່ຍາວກວ່າ 1 ວິນາທີແລະຜູ້ທີ່ບໍ່ໃຊ້ດັດສະນີ. ເມື່ອບັນທຶກນີ້ມີບາງຂໍ້ມູນ, ທ່ານສາມາດວິເຄາະມັນສໍາລັບການນໍາໃຊ້ດັດສະນີທີ່ມີເຄື່ອງມືການນໍາໃຊ້ດັດສະນີ pt-index , ຫຼືເຄື່ອງມື 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# Hostname: *# ໄຟລ໌: mysql-slow. log# ລວມ: 8 ລວມ, 6 ເອກະລັກ, 1. 14 QPS, 0. 00x concurrency ________________# ຊ່ວງເວລາ: 2014-02-13 22:23:52 ກັບ 22:23:59# Attribute total min max avg 95% stddev median============ ======= ======= ======= ======= ======= == ===== =======# Exec time 3ms 267us 406us 343us 403us 39us 348us# Lock time 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=== === ============== ============= ===== ====== === == ===============Profile ## Rank Query ID ການຕອບສະຫນອງເວລາໂທ R / Call V / M Item=== === ============== ============= ===== ====== === == ===============# 1 0x728E539F7617C14D 0 0011 41 0% 3 0 0004 0 00 SELECT blog_article# 2 0x1290EEE0B201F3FF 0 0003 12 8% 1 0 0003 0 00 SELECT portfolio_item# 3 0x31DE4535BDBFA465 0 0003 12 6% 1 0003 0 00 SELECT portfolio_item# 4 0xF14E15D0F47A5742 0 0003 12 1% 1 0003 0 00 SELECT portfolio_category# 5 0x8F848005A09C9588 0 0003 11 8% 1 0 0003 0 00 SELECT blog_category# 6 0x55F49C753CA2ED64 0 0003 9 7% 1 0003 0 00 SELECT blog_article=== === ============== ============= ===== ====== === == ===============# Query 1: 0 QPS, 0x concurrency, ID 0x728E539F7617C14D at byte 736 ______# ຜະລິດແນນ: V / M = 00 00# ຊ່ວງເວລາ: ທຸກເຫດການທີ່ເກີດຂຶ້ນໃນປີ 2014-02-13 22:23:52# Attribute pct total min max avg 95% stddev median=== ======== === ======= ======= ======= ======= ====== = ======= =======# Count 37 3# Exec time 40 1ms 352us 406us 375us 403us 22us 366us# Lock time 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 1. 29 7. 70# ຂະຫນາດການສອບຖາມ 47 1 02k 261 262 261 25 258 32 0 258 32# String:# Hosts localhost# ຜູ້ຊົມໃຊ້ *# ການແຈກຢາຍ Query_time# 1us# 10us# 100us ################################################## ################# 1ms# 10ms# 100ms# 1s# 10s +# ຕາລາງ# SHOW TABLE STATUS LIKE 'blog_article' \ G# SHOW CREATE TABLE `blog_article` \ G# EXPLAIN / *! 50100 ສ່ວນປະກອບ * /SELECT b0_. id AS id0, b0_. slug AS slug1, b0_ ຊື່ AS title2, b0_. excerpt AS excerpt3, b0_. external_link AS external_link4, b0_. ຄໍາອະທິບາຍ AS description5, b0_. ສ້າງ AS created6, b0_. ອັບເດດ AS ອັບເດດ 7 ຈາກ blog_article b0_ ORDER BY b0_. ສ້າງ DESC LIMIT 10
ຖ້າທ່ານຕ້ອງການທີ່ຈະວິເຄາະບັນທຶກເຫລົ່ານີ້ດ້ວຍມື, ທ່ານກໍ່ສາມາດເຮັດເຊັ່ນດຽວກັນ - ແຕ່ທໍາອິດທ່ານຈໍາເປັນຕ້ອງສົ່ງອອກບັນທຶກເຂົ້າໃນຮູບແບບ "ສາມາດວິເຄາະ" ໄດ້. ນີ້ສາມາດເຮັດໄດ້ດ້ວຍ:
mysqldumpslow / var / log / mysql / mysql-slow log
ຕົວກໍານົດການ Semalt ສາມາດເກັບຂໍ້ມູນຕື່ມອີກແລະໃຫ້ແນ່ໃຈວ່າສິ່ງທີ່ສໍາຄັນເທົ່ານັ້ນທີ່ຖືກສົ່ງອອກ. ຕົວຢ່າງ: 10 ຄໍາຖາມສຸດຍອດທີ່ຖືກຈັດຮຽງໂດຍໃຊ້ເວລາປະຕິບັດໂດຍສະເລ່ຍ.
mysqldumpslow -t 10 -s at / var / log / mysql / localhost-slow log
ສໍາລັບຕົວກໍານົດອື່ນໆ, ເບິ່ງຂໍ້ມູນ.
ສະຫຼຸບ
ໃນການຕອບສະຫນອງ MySQL ທີ່ສົມບູນແບບນີ້ພວກເຮົາໄດ້ເບິ່ງວິທີການຕ່າງໆເພື່ອເຮັດໃຫ້ MySQL ບິນ. ນີ້ແມ່ນທັງຫມົດທີ່ທາງທິດສະດີ, ແຕ່ - ສໍາລັບກໍລະນີການນໍາໃຊ້ໂລກທີ່ແທ້ຈິງຂອງການນໍາໃຊ້ເຕັກນິກເຫຼົ່ານີ້ໃນ app ທີ່ແທ້ຈິງ, ຢູ່ tuned ສໍາລັບໂຄງການເດືອນຜົນປະໂຫຍດຂອງພວກເຮົາ - ມາໃນໄວໆນີ້!
ພວກເຮົາໄດ້ພາດໂອກາດເຕັກນິກແລະຄໍາແນະນໍາໃດໆບໍ? ໃຫ້ພວກເຮົາຮູ້!
ພົບຜູ້ຂຽນ Bruno Skvorc
Bruno ແມ່ນໂຄ້ດຈາກປະເທດໂຄຣເອເຊຍທີ່ມີປະລິນຍາໂທໃນວິທະຍາສາດຄອມພິວເຕີແລະພາສາອັງກິດແລະວັນນະຄະດີ. ລາວດໍາເນີນການທຸລະກິດ cryptocurrency ທີ່ Bitfalls. com ໂດຍຜ່ານການທີ່ລາວໄດ້ເຮັດທຸລະກິດ crypto ແລະເຮັດໃຫ້ blockchain ເຕັກນິກທີ່ເຫມາະສົມກັບມະຫາຊົນ. ລາວຍັງເປັນບັນນາທິການສໍາລັບ SitePoint, ແລະຜູ້ເຜີຍແຜ່ຂ່າວສານສໍາລັບນັກພັດທະນາຂອງ Diffbot Source . com