Tablodan rastgele bir satır seçmeye çalışarak, delik açmadan otomatikleştirilmiş birincil anahtara göre.MySQL: Neden birincil anahtarı anahtar kullanarak rasgele oluşturulmuş bir sayı ile karşılaştırıyorsunuz?
tablo şema:
CREATE TABLE IF NOT EXISTS `testTable` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`data` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;
INSERT INTO `testTable` (`id`, `data`) VALUES
(1, 'hello'),
(2, 'world'),
(3, 'new'),
(4, 'data'),
(5, 'more and more'),
(6, 'data '),
(7, 'more rows here'),
(8, 'most rows here'),
(9, 'testing'),
(10,'last');
Sorgular:
1/explain select * from testTable where id = ceil(Rand()*10) limit 1 ;
http://sqlfiddle.com/#!2/6e2b1/1
Sonuç:
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
--------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | testTable | ALL | (null) | (null) | (null) | (null) | 10 | Using where |
2/explain select * from testTable where id = 7 limit 1 ;
http://sqlfiddle.com/#!2/6e2b1/2
Sonuç: Neden sorgu 1. dizini kullanarak değil
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
---------------------------------------------------------------------------------------------------
| 1 | SIMPLE | testTable | const | PRIMARY | PRIMARY | 4 | const | 1 | |
, ceil(rand()*10)
ideal ardından birincil anahtar ile karşılaştırılabilir hangi bir sabite değerlendirmek gerekir? Optimizatör bu şekilde çalışmamalı mı? Yoksa burada bariz bir şeyi özlüyorum.
, sistemin bu sonuçları her bir sonuçla karşılaştırabilmek için önce tüm satırları getirmesini sağlar. Rasgele tam sayı değerini almak için "dış" bir seçim kullanmanız daha iyi olacaktır ve ardından birincil anahtarınızı almak için bunu kullanın. – Najzero