索引 - 入门

2018-06-24  本文已影响9人  诺之林

本文的示例代码参考index_basic

目录

准备

MySQL

docker run --name mysql-index -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.17

关于Docker更多参考Docker入门

DB

docker exec -i mysql-index mysql -uroot -p123456  <<< "CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8 COLLATE utf8_general_ci;"

Table

vim init.sql
CREATE TABLE `user` (
  `id` INT unsigned NOT NULL AUTO_INCREMENT,
  `first_name` VARCHAR(50) NOT NULL DEFAULT '',
  `last_name` VARCHAR(50) NOT NULL DEFAULT '',
  `age` INT NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
docker exec -i mysql-index mysql -uroot -p123456 demo < ./init.sql

Data

vim init.php
<?php

function connectDB() {
    $db = array(
        'host' => '127.0.0.1',
        'port' => 3306,
        'username' => 'root',
        'password' => '123456',
        'dbname' => 'demo',
    );

    $mysqli = new mysqli($db['host'], $db['username'], $db['password'], $db['dbname'], $db['port']);
    if ($mysqli->connect_error) {
        die('Connect Error (' . $mysqli->connect_errno . '): '. $mysqli->connect_error);
    }
    
    $mysqli = mysqli_init();
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
    $mysqli->real_connect($db['host'], $db['username'], $db['password'], $db['dbname'], $db['port']);

    return $mysqli;
}

function generateName() {
    $username = '';
    $length = mt_rand(3, 8);
    $chars = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    for ($i = 0; $i < $length; $i ++) {
        $username = $username.($chars[mt_rand(0, count($chars) - 1)]);
    }

    return $username;
}

function generateUser() {
    $data  = [];
    $data['first_name'] = generateName();
    $data['last_name'] = generateName();
    $data['age'] = mt_rand(10, 50);
    return $data;
}

function main() {
    $mysqli = connectDB();

    $count = 1000;
    $times = 1000;
    for ($i = 0; $i < $count; $i++) {
        $sql = "INSERT INTO user(`first_name`, `last_name`, `age`) VALUES";
        for ($j = 0; $j < $times; $j++) {
            $user = generateUser();
            $sql = $sql . "('" . $user['first_name'] . "', '" . $user['last_name'] . "', " . $user['age'] . ')';
            if ($j < $times - 1) {
                $sql = $sql . ', ';
            }
        }

        $ret = $mysqli->query($sql);
        if (! $ret) {
            echo $mysqli->error;
        }
    }
}

main();
php init.php

PHP环境搭建和扩展安装 详细参考PHP开发 之 开发环境 & PHP开发 之 开发调试

索引

Primary Key

SHOW INDEX FROM user;
SELECT * FROM `user` WHERE id = '66666';
-- 0.001s elapsed
SELECT * FROM `user` WHERE first_name = 'fcl';
-- 0.404s elapsed

Index

ALTER TABLE `user` ADD INDEX first_last_age(first_name, last_name, age);

SHOW INDEX FROM user;
SELECT * FROM `user` WHERE first_name = 'fcl';
-- 0.001s elapsed
SELECT * FROM `user` WHERE first_name LIKE 'fcl%';
-- 0.001s elapsed

Invalid

SELECT * FROM `user` WHERE last_name = 'fcl';
-- 0.412s elapsed

SELECT * FROM `user` WHERE first_name LIKE '%fcl';
-- 0.558s elapsed

有效索引

全值匹配

SELECT * FROM `user` WHERE id = '66666';
-- 0.001s elapsed

SELECT * FROM `user` WHERE first_name = 'fcl';

前缀索引

SELECT * FROM `user` WHERE first_name = 'fcl';
-- 0.001s elapsed

SELECT * FROM `user` WHERE last_name = 'fcl';
-- 0.412s elapsed
SELECT * FROM `user` WHERE first_name LIKE 'fcl%';
-- 0.001s elapsed

SELECT * FROM `user` WHERE first_name LIKE '%fcl';
-- 0.558s elapsed

参考

上一篇 下一篇

猜你喜欢

热点阅读