লগিং থেকে বিলম্বিত সম্পর্ক সম্পর্কিত বিভিন্ন কারণে আমি আমার সিস্টেমে কিছু সময়ের জন্য ইউআইডি ব্যবহার করছি using আমি যে ফর্ম্যাটগুলি ব্যবহার করেছিলাম সেগুলি থেকে কম নিখুঁত হয়ে ওঠার সাথে সাথে পরিবর্তিত হয়েছি:
VARCHAR(255)
VARCHAR(36)
CHAR(36)
BINARY(16)
এটি যখন আমি চূড়ান্ত একটিতে পৌঁছেছিলাম তখন আমি BINARY(16)
বেসিক অটো-ইনগ্রিমেন্ট পূর্ণসংখ্যার সাথে পারফরম্যান্সের তুলনা করতে শুরু করি। পরীক্ষা ও ফলাফল নিচে দেখানো হয়েছে, কিন্তু আপনি যদি শুধু সারসংক্ষেপ চান, এটা নির্দেশ করে যে INT AUTOINCREMENT
এবং BINARY(16) RANDOM
ডেটার উপর অভিন্ন কর্মক্ষমতা আছে 200,000 পর্যন্ত রেঞ্জ (ডাটাবেস প্রাক জনবহুল ছিল পরীক্ষার পূর্বে)।
আমি প্রাথমিক কী হিসাবে ইউআইডিগুলিকে ব্যবহার করার দিকে সংশয়ী ছিলাম এবং সত্যই আমি এখনও আছি, তবে আমি এখানে নমনীয় ডেটাবেস তৈরির সম্ভাবনা দেখতে পাচ্ছি যা উভয়ই ব্যবহার করতে পারে। যেখানে অনেক লোক উভয়ের সুবিধার জন্য চাপ দেয় সেখানে উভয় ডেটা ব্যবহার করে কী কী অসুবিধাগুলি বাতিল হয়?
PRIMARY INT
UNIQUE BINARY(16)
এই ধরণের সেট আপের জন্য ব্যবহারের ক্ষেত্রটি আন্তঃ-টেস্ট সম্পর্কের জন্য traditionalতিহ্যবাহী প্রাথমিক কী হবে, আন্তঃব্যবস্থার সম্পর্কের জন্য অনন্য সনাক্তকারী ব্যবহৃত হবে।
আমি মূলত যা আবিষ্কার করার চেষ্টা করছি তা হল দুটি পদ্ধতির মধ্যে দক্ষতার পার্থক্য। ব্যবহৃত চারগুণ ডিস্ক স্পেস ছাড়াও অতিরিক্ত ডেটা যুক্ত হওয়ার পরে যা বেশিরভাগ ক্ষেত্রেই নগন্য হতে পারে, সেগুলি আমার কাছে একই বলে উপস্থিত হয়।
স্কিমা:
-- phpMyAdmin SQL Dump
-- version 4.0.10deb1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Sep 22, 2015 at 10:54 AM
-- Server version: 5.5.44-0ubuntu0.14.04.1
-- PHP Version: 5.5.29-1+deb.sury.org~trusty+3
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `test`
--
-- --------------------------------------------------------
--
-- Table structure for table `with_2id`
--
CREATE TABLE `with_2id` (
`guidl` bigint(20) NOT NULL,
`guidr` bigint(20) NOT NULL,
`data` varchar(255) NOT NULL,
PRIMARY KEY (`guidl`,`guidr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `with_guid`
--
CREATE TABLE `with_guid` (
`guid` binary(16) NOT NULL,
`data` varchar(255) NOT NULL,
PRIMARY KEY (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Table structure for table `with_id`
--
CREATE TABLE `with_id` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=197687 ;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
মাপদণ্ড প্রবেশ করান:
function benchmark_insert(PDO $pdo, $runs)
{
$data = 'Sample Data';
$insert1 = $pdo->prepare("INSERT INTO with_id (data) VALUES (:data)");
$insert1->bindParam(':data', $data);
$insert2 = $pdo->prepare("INSERT INTO with_guid (guid, data) VALUES (:guid, :data)");
$insert2->bindParam(':guid', $guid);
$insert2->bindParam(':data', $data);
$insert3 = $pdo->prepare("INSERT INTO with_2id (guidl, guidr, data) VALUES (:guidl, :guidr, :data)");
$insert3->bindParam(':guidl', $guidl);
$insert3->bindParam(':guidr', $guidr);
$insert3->bindParam(':data', $data);
$benchmark = array();
$time = time();
for ($i = 0; $i < $runs; $i++) {
$insert1->execute();
}
$benchmark[1] = 'INC ID: ' . (time() - $time);
$time = time();
for ($i = 0; $i < $runs; $i++) {
$guid = openssl_random_pseudo_bytes(16);
$insert2->execute();
}
$benchmark[2] = 'GUID: ' . (time() - $time);
$time = time();
for ($i = 0; $i < $runs; $i++) {
$guid = openssl_random_pseudo_bytes(16);
$guidl = unpack('q', substr($guid, 0, 8))[1];
$guidr = unpack('q', substr($guid, 8, 8))[1];
$insert3->execute();
}
$benchmark[3] = 'SPLIT GUID: ' . (time() - $time);
echo 'INSERTION' . PHP_EOL;
echo '=============================' . PHP_EOL;
echo $benchmark[1] . PHP_EOL;
echo $benchmark[2] . PHP_EOL;
echo $benchmark[3] . PHP_EOL . PHP_EOL;
}
মানদণ্ড নির্বাচন করুন:
function benchmark_select(PDO $pdo, $runs) {
$select1 = $pdo->prepare("SELECT * FROM with_id WHERE id = :id");
$select1->bindParam(':id', $id);
$select2 = $pdo->prepare("SELECT * FROM with_guid WHERE guid = :guid");
$select2->bindParam(':guid', $guid);
$select3 = $pdo->prepare("SELECT * FROM with_2id WHERE guidl = :guidl AND guidr = :guidr");
$select3->bindParam(':guidl', $guidl);
$select3->bindParam(':guidr', $guidr);
$keys = array();
for ($i = 0; $i < $runs; $i++) {
$kguid = openssl_random_pseudo_bytes(16);
$kguidl = unpack('q', substr($kguid, 0, 8))[1];
$kguidr = unpack('q', substr($kguid, 8, 8))[1];
$kid = mt_rand(0, $runs);
$keys[] = array(
'guid' => $kguid,
'guidl' => $kguidl,
'guidr' => $kguidr,
'id' => $kid
);
}
$benchmark = array();
$time = time();
foreach ($keys as $key) {
$id = $key['id'];
$select1->execute();
$row = $select1->fetch(PDO::FETCH_ASSOC);
}
$benchmark[1] = 'INC ID: ' . (time() - $time);
$time = time();
foreach ($keys as $key) {
$guid = $key['guid'];
$select2->execute();
$row = $select2->fetch(PDO::FETCH_ASSOC);
}
$benchmark[2] = 'GUID: ' . (time() - $time);
$time = time();
foreach ($keys as $key) {
$guidl = $key['guidl'];
$guidr = $key['guidr'];
$select3->execute();
$row = $select3->fetch(PDO::FETCH_ASSOC);
}
$benchmark[3] = 'SPLIT GUID: ' . (time() - $time);
echo 'SELECTION' . PHP_EOL;
echo '=============================' . PHP_EOL;
echo $benchmark[1] . PHP_EOL;
echo $benchmark[2] . PHP_EOL;
echo $benchmark[3] . PHP_EOL . PHP_EOL;
}
পরীক্ষা:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
benchmark_insert($pdo, 1000);
benchmark_select($pdo, 100000);
ফলাফল:
INSERTION
=============================
INC ID: 3
GUID: 2
SPLIT GUID: 3
SELECTION
=============================
INC ID: 5
GUID: 5
SPLIT GUID: 6
BINARY(16)
আমি মনে করি যে আমরা উভয়ই একমত হয় কোনও ইউইউডি সঞ্চয় করার সবচেয়ে কার্যকর উপায়, তবেUNIQUE
সূচী সম্পর্কে, আমাকে কি কেবল একটি নিয়মিত সূচক ব্যবহার করা উচিত? বাইটগুলি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত আরএনজি ব্যবহার করে তৈরি করা হয়, তাই আমি কি পুরোপুরি এলোমেলোতার উপর নির্ভর করব এবং চেকগুলি ত্যাগ করব?