SQL: குறியீட்டு இருந்தபோதிலும் மோசமான செயல்திறன்

ஒரு SQL தரவுத்தளத்தின் பின்வரும் செயல்திறன் சிக்கலை நான் எதிர்கொண்டேன்: users 1,000,000 உள்ளீடுகளைக் கொண்ட "பயனர்கள்" என்று அழைக்கப்படும் ஒரு SQL அட்டவணையில், பதிவுகளின் எண்ணிக்கையை நிர்ணயிப்பது ஏற்றுக்கொள்ள முடியாத 28 வினாடிகள் எடுத்தது. பதிவுகளின் நேரங்கள் “உருவாக்கப்பட்ட” நெடுவரிசையில் “Ymd H: i: s” வடிவத்தில் சேமிக்கப்பட்டன.


பயன்படுத்தப்படும் வினவல்

SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';

DATETIME வடிவமைப்பின் "உருவாக்கப்பட்ட" நெடுவரிசையில் ஏற்கனவே ஒரு குறியீட்டு இருந்தபோதிலும், இந்த ஏற்றுதல் நேரத்திற்கு வழிவகுத்தது

ALTER TABLE `users` ADD INDEX `created` (`created`);

அமைக்கப்பட்டது. மோசமான செயல்திறனுக்கான காரணம் DATE இன் செயல்பாட்டு அழைப்பு: “உருவாக்கப்பட்டது” என்ற குறியீட்டு நெடுவரிசை DATE செயல்பாட்டால் அனுப்பப்பட்டு குறியீட்டை பயனற்றதாக ஆக்குகிறது. வினவல் உகப்பாக்கி "உருவாக்கப்பட்டது" மட்டுமே தெரியும், ஆனால் DATE (உருவாக்கப்பட்டது) இன் விளைவாக இல்லை. உகந்த வினவல்

SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';

0.4 விநாடிகளில் விரும்பிய முடிவுக்கு வழிவகுக்கிறது.

மீண்டும்