SQL Hints (SQL 锟脚伙拷锟斤拷)

SQL 锟脚伙拷锟斤拷锟斤拷锟斤拷强锟斤拷指锟斤拷锟斤拷锟接筹拷锟斤拷锟截讹拷锟斤拷锟斤拷锟接★拷锟斤拷锟皆革拷锟斤拷锟斤拷锟揭伙拷锟斤拷呕锟斤拷锟饺ナ癸拷锟斤拷囟锟斤拷姆锟斤拷锟斤拷锟斤拷锟斤拷樱锟� 锟斤拷锟斤拷锟斤拷锟皆斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷谢锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷状态锟戒化锟斤拷锟解。

SQL hints 锟角伙拷锟斤拷 SQL 锟斤拷锟侥★拷锟斤拷为 SQL 注锟酵会被 SQL 执锟斤拷锟斤拷锟斤拷锟皆o拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� MySQL 锟斤拷锟斤拷锟斤拷锟斤拷MySQL proxy 锟斤拷锟斤拷锟轿何凤拷锟斤拷墙锟侥癸拷锟斤拷锟斤拷

锟斤拷锟街э拷锟� SQL hints锟斤拷MYSQLND_MS_MASTER_SWITCH hints 锟斤拷锟斤拷指锟斤拷锟斤拷锟斤拷锟� master 锟斤拷锟斤拷锟叫o拷MYSQLND_MS_SLAVE_SWITCH 锟斤拷锟斤拷指锟斤拷锟斤拷 slave 锟斤拷锟斤拷锟叫o拷MYSQLND_MS_LAST_USED_SWITCH 锟斤拷锟斤拷指锟斤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟斤拷锟斤拷执锟叫碉拷 slave 锟斤拷锟斤拷锟叫★拷

锟斤拷锟斤拷锟缴拷锟斤拷锟斤拷锟斤拷锟斤拷荩锟斤拷锟窖拷欠锟斤拷锟� SQL hints锟斤拷锟斤拷只锟斤拷锟斤拷锟斤拷锟侥匡拷头锟斤拷识锟斤拷

Example #1 锟斤拷锟斤拷一锟斤拷 master 锟斤拷一锟斤拷 slave 锟侥诧拷锟�

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "192.168.2.27",
                "port": "3306"
            }
        }
    }
}

Example #2 SQL hints 锟斤拷止锟斤拷锟斤拷锟叫伙拷

<?php
$mysqli 
= new mysqli("myapp""username""password""database");
if (
mysqli_connect_errno())
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* 锟斤拷锟斤拷 1锟斤拷锟斤拷锟斤拷一锟斤拷 SQL 锟矫伙拷锟斤拷锟斤拷锟斤拷没锟斤拷 SELECT 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 master 锟斤拷 */
if (!$mysqli->query("SET @myrole='master'")) {
 
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}

/* 锟斤拷锟斤拷 1锟斤拷锟斤拷为指锟斤拷锟斤拷 SQL hint */
if (!($res $mysqli->query(sprintf("/*%s*/SELECT @myrole AS _role"MYSQLND_MS_LAST_USED_SWITCH)))) {
 
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
} else {
 
$row $res->fetch_assoc();
 
$res->close();
 
printf("@myrole = '%s'\n"$row['_role']);
}
$mysqli->close();
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

@myrole = 'master'

锟斤拷锟斤拷姆锟斤拷锟绞癸拷锟� MYSQLND_MS_LASTER_USED_SWITCH 锟斤拷锟斤拷止锟斤拷 master 锟斤拷 slave 之锟斤拷锟斤拷锟斤拷谢锟斤拷锟斤拷锟绞癸拷锟斤拷锟斤拷锟� SELECT 锟斤拷头锟斤拷锟斤拷洹�

SQL hints 也锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 master 锟斤拷锟斤拷锟斤拷 SELECT 锟斤拷洹� 锟解经锟斤拷锟斤拷锟斤拷锟斤拷 slave 锟叫碉拷锟斤拷锟斤拷锟斤拷锟斤拷锟� master锟斤拷锟斤拷锟斤拷希锟斤拷锟斤拷取锟斤拷前锟斤拷锟捷碉拷时锟斤拷

锟斤拷 1.2.0 锟芥本锟叫o拷锟斤拷锟斤拷锟剿凤拷锟今级憋拷母锟斤拷睿拷锟斤拷诖锟斤拷锟绞憋拷锟斤拷莼锟饺★拷锟斤拷锟斤拷狻� 使锟矫凤拷锟今级别,匡拷锟皆斤拷锟酵讹拷锟斤拷锟斤拷锟斤拷锟侥癸拷注锟斤拷锟斤拷锟� SQL hints 锟斤拷使锟矫★拷 锟斤拷锟斤拷锟节凤拷锟今级憋拷锟揭伙拷锟斤拷缘锟斤拷陆锟斤拷锟斤拷业锟斤拷锟斤拷锟斤拷说锟斤拷锟斤拷

Example #3 锟斤拷同锟斤拷锟接迟讹拷锟斤拷

<?php
$mysqli 
= new mysqli("myapp""username""password""database");
if (!
$mysqli)
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* Force use of master, master has always fresh and current data */
if (!$mysqli->query(sprintf("/*%s*/SELECT critical_data FROM important_table"MYSQLND_MS_MASTER_SWITCH))) {
 
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}
?>

锟斤拷使锟斤拷锟叫o拷slave 锟斤拷应锟斤拷锟斤拷同锟斤拷锟侥憋拷锟斤拷锟斤拷没锟叫革拷锟斤拷 SQL hints 锟斤拷时锟津,诧拷锟斤拷诜锟斤拷锟� CREATE INSERT 锟斤拷涞� master 锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷通锟斤拷锟借定 MYSQLND_MS_SLAVE_SWITCH 锟斤拷锟斤拷锟斤拷些锟斤拷锟斤拷锟� slave 锟斤拷锟斤拷锟叫★拷锟斤拷锟界建锟斤拷一锟斤拷锟斤拷时锟斤拷锟斤拷

Example #4 Table creation on a slave

<?php
$mysqli 
= new mysqli("myapp""username""password""database");
if (!
$mysqli)
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* 强锟斤拷锟斤拷 slave 锟斤拷锟斤拷 */
if (!$mysqli->query(sprintf("/*%s*/CREATE TABLE slave_reporting(id INT)"MYSQLND_MS_SLAVE_SWITCH))) {
 
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}
/* 使锟矫刚革拷使锟矫碉拷 slave 锟斤拷锟斤拷 */
if (!$mysqli->query(sprintf("/*%s*/INSERT INTO slave_reporting(id) VALUES (1), (2), (3)"MYSQLND_MS_LAST_USED_SWITCH))) {
 
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}
/* 锟斤拷使锟斤拷 MYSQLND_MS_SLAVE_SWITCH 锟斤拷锟斤拷锟叫伙拷锟斤拷锟斤拷锟斤拷一台 slave */
if ($res $mysqli->query(sprintf("/*%s*/SELECT COUNT(*) AS _num FROM slave_reporting"MYSQLND_MS_LAST_USED_SWITCH))) {
  
$row $res->fetch_assoc();
  
$res->close();
  
printf("There are %d rows in the table 'slave_reporting'"$row['_num']);
} else {
  
printf("[%d] %s\n"$mysqli->errno$mysqli->error);
}
$mysqli->close();
?>

SQL hint MYSQLND_MS_LAST_USED 锟斤拷止锟叫伙拷锟斤拷锟接o拷 锟斤拷锟斤拷使锟斤拷锟斤拷一锟斤拷使锟矫碉拷锟斤拷锟接★拷