GVKun编程网logo

php – 嵌套MySQL的类别(mysql嵌套语句)

7

本篇文章给大家谈谈php–嵌套MySQL的类别,以及mysql嵌套语句的知识点,同时本文还将给你拓展apachephpmysqlphp生成mysql的数据字典、Mysql学习PHPMySQL的安装与配

本篇文章给大家谈谈php – 嵌套MySQL的类别,以及mysql嵌套语句的知识点,同时本文还将给你拓展apache php mysql php生成mysql的数据字典、Mysql学习PHP MySQL的安装与配置详解、Mysql应用PHP中实现MySQL嵌套事务的两种解决方案、Mysql必读深入理解MySQL的数据库引擎的类型等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

php – 嵌套MySQL的类别(mysql嵌套语句)

php – 嵌套MySQL的类别(mysql嵌套语句)

API返回类似的类别:
[1] => Array
        (
            [category_id] => 14308
            [parent_id] => 14308
            [level] => 0
        )

    [2] => Array
        (
            [category_id] => 179836
            [parent_id] => 14308
            [level] => 1
        )

        [3] => Array
            (
                [category_id] => 230022
                [parent_id] => 179836
                [level] => 2
            )

我需要将它们插入到DB中,如下所示:

╔═════════════╦═══════════╗
║ category_id ║ parent_id ║
╠═════════════╬═══════════╣
║       14308 ║         0 ║
║      179836 ║     14308 ║
║      230022 ║    179836 ║
╚═════════════╩═══════════╝

…这很容易,但是category_to_path表很棘手,我似乎无法弄明白.它必须是这样的:

╔═════════════╦═════════╦═══════╗
║ category_id ║ path_id ║ level ║
╠═════════════╬═════════╬═══════╣
║       14308 ║   14308 ║     0 ║
║      179836 ║   14308 ║     0 ║
║      179836 ║  179836 ║     1 ║
║      230022 ║   14308 ║     0 ║
║      230022 ║  179836 ║     1 ║
║      230022 ║  230022 ║     2 ║
╚═════════════╩═════════╩═══════╝

这是我到目前为止:

$path_ids;
for ($i=0; $i <= ($category->CategoryLevel-1); $i++) { 
// -1 cause the API returns a non zero-based level

  $path_ids[$i]['category_id'] = $category->CategoryID;

  if ($category->CategoryLevel-1 == $i) {
    $path_ids[$i]['path_id'] = $category->CategoryParentID[0];
  }
  elseif ($category->CategoryLevel-1) {
    // ?
  }

  $path_ids[$i]['level'] = $i;

}
以下查询应该为您提供类别和路径.它不提供级别,因为您的原始数据缺少任何类型的行号.如果要获取级别,可能需要使用一些动态sql.

我使用的策略是交叉连接类别,这会生成所有可能的起点和终点.它还会生成表不支持的一些路径.要删除这些不需要的路径,我会针对子查询检查每个路径,以确保可以通过3个步骤或更少的步骤遍历从类别到路径来创建它.

SELECT t1.category_id AS category_id,t2.category_id AS path_id
FROM yourTable t1
CROSS JOIN yourTable t2
INNER JOIN
(
    SELECT t1.category_id AS category_id_1,t2.category_id AS category_id_2,t3.category_id AS category_id_3
    FROM yourTable t1
    LEFT JOIN yourTable t2
        ON t1.parent_id = t2.category_id
    LEFT JOIN yourTable t3
        ON t2.parent_id = t3.category_id
) t2
    ON t1.category_id = t2.category_id_1 AND
       t2.category_id IN (t2.category_id_1,t2.category_id_2,t2.category_id_3)
ORDER BY category_id,path_id

apache php mysql php生成mysql的数据字典

apache php mysql php生成mysql的数据字典

把mysql数据库生成数据字典,直接可用便于查看数据库表、字段,做一个数据字典是很有必要的,下面只需要简单更改下配置就可以用了,样式也是挺好的。

 
 
 
<meta http-equiv="Content-Type" c><title>''.APPNAME.''--数据字典</title><style type="text/css"> 
  table caption, table th, table td { 
    padding: 0.1em 0.5em 0.1em 0.5em; 
    margin: 0.1em; 
    vertical-align: top; 
  } 
  th { 
    font-weight: bold; 
    color: black; 
    background: #D3DCE3; 
  } 
  table tr.odd th, .odd { 
    background: #E5E5E5; 
  } 
  table tr.even th, .even { 
    background: #f3f3f3; 
  } 
  .db_table{ 
    border-top:1px solid #333; 
  } 
  .title{font-weight:bold;} 
</style><div> 
  <b>''.APPNAME.''--数据字典</b> 
</div> 
<div>(注:共''.$tab_count.''张表,按ctrl+F查找关键字)</div>''."\n"; 
for($i=0;$i''."\n"; 
echo '' 
登录后复制
  • ''; echo ($i+1).''、表名:['' . $array[$i][''Name''] . ''] 注释:'' . $array[$i][''Comment'']; echo ''
  • ''."\n"; //查询数据库字段信息 $tab_name = $array[$i][''Name'']; $sql_tab=''show full fields from `'' . $array[$i][''Name''].''`''; $tab_result=mysql_query($sql_tab); $tab_array=array(); while($r=mysql_fetch_assoc($tab_result)){ $tab_array[]=$r; } //show keys $keys_result=mysql_query("show keys from `".$array[$i][''Name''].''`'',$conn); $arr_keys=mysql_fetch_array($keys_result); echo ''
  • ''; echo ''''; for($j=0;$j''."\n"; echo '' ''."\n"; echo '' ''."\n"; echo '' ''."\n"; echo '' ''."\n"; echo '' ''."\n"; echo '' ''."\n"; echo '' ''."\n"; echo '' ''."\n"; } echo ''
    字段 类型 为空 额外 默认 整理 备注
    '' . $tab_array[$j][''Field''] . '''' . $tab_array[$j][''Type''] . '''' . ($key_value!=''''?$key_value:$tab_array[$j][''Null'']) . '''' . $tab_array[$j][''Extra''] . '''' . $tab_array[$j][''Default''] . '''' . $tab_array[$j][''Collation''] . '''' . ($key_value!=''''?$key_name:$tab_array[$j][''Comment'']) . ''
  • ''."\n"; echo ''''."\n"; } echo ''''."\n"; echo ''''."\n";

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

    以上就介绍了apache php mysql php生成mysql的数据字典,包括了apache php mysql方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    Mysql学习PHP MySQL的安装与配置详解

    Mysql学习PHP MySQL的安装与配置详解

    《MysqL学习PHP MysqL的安装与配置详解》要点:
    本文介绍了MysqL学习PHP MysqL的安装与配置详解,希望对您有用。如果有疑问,可以联系我们。

    MysqL教程 一、安装配置PHP

    MysqL教程1、下载PHP的版本zip包之后,解压缩到指定目录.下载地址:http://www.PHP.net/downloads.PHP
    2、在Apache的httpd.conf文件中加入以下

    MysqL教程#PHP模块加载

    MysqL教程LoadModule PHP5_module "D:/Software/GreenSoft/PHP/PHP5.4.6/PHP5apache2_2.dll"

    MysqL教程#PHP.ini路径设置

    MysqL教程PHPIniDir "D:/Software/GreenSoft/PHP/PHP5.4.6/"
    AddType application/x-httpd-PHP .PHP
    AddType application/x-httpd-PHP-source .PHPs

    MysqL教程#加入后缀名过滤

    MysqL教程AddHandler application/x-httpd-PHP .PHP

    MysqL教程#或者以下配置应用过滤

    MysqL教程<FilesMatch \.PHP$>
    SetHandler application/x-httpd-PHP
    </FilesMatch>

    MysqL教程二、配置MysqL

    MysqL教程在PHP.ini修改以下配置:

    MysqL教程#修改PHP的扩展库目录为你的实际路径
    extension_dir = "D:/Software/GreenSoft/PHP/PHP5.4.6/ext"
    #去掉 #extension=PHP_MysqL.dll前面的#号
    extension=PHP_MysqL.dll

    MysqL教程 三、安装MysqL

    MysqL教程MysqL的下载地址:http://www.MysqL.com/downloads/

    MysqL教程下载安成相应版本的压缩包后.解压至相应的目录D:\Software\GreenSoft\MysqL\MysqL56 .

    MysqL教程1. 将MysqL安装成服务

    MysqL教程在Windows环境变量的系统变量Path中追加D:\Software\GreenSoft\MysqL\MysqL56\bin;,并在Dos窗口中输入以下命令:

    MysqL教程
    #进入MysqL的bin目录
    cd D:\Software\GreenSoft\MysqL\MysqL56\bin
    #停掉之前开启的MysqL进程
    MysqLadmin -u root -p debug shutdown
    #安装MysqL服务.指定服务名MysqL56,配置文件名路径
    MysqLd --install MysqL56 --defaults-file=D:\Software\GreenSoft\MysqL\MysqL56\my.cnf
    #启动服务程序
    net start MysqL56
    #停止服务程序
    net stop MysqL56 / MysqLadmin -u root shutdown
    #移除服务
    MysqLd --remove MysqL56 / sc delete MysqL56
    #测试MysqL
    MysqLshow
    MysqLshow -u root MysqL56
    MysqLadmin version status proc
    MysqL test

    MysqL教程2.配置MysqL配置文件

    MysqL教程
    port=3306 # MysqL服务端默认监听(listen on)的TCP/IP端口
    serverid = 1 
    socket = /tmp/MysqL.sock 
    basedir="D:/Software/GreenSoft/MysqL/MysqL56/" # 基准根路径
    datadir="E:/DaTaroot/MysqLData/" # MysqL数据库文件所在目录
    log-error="D:/Software/GreenSoft/MysqL/MysqL56/log/error.log" #错误日志文件
    log-slow-queries="D:/Software/GreenSoft/MysqL/MysqL56/log/slow-query.log"
    character-set-server=latin1 # 服务端使用的字符集默认为8比特编码的latin1字符集
    default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
    wait_timeout = 10 #指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10
    sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # sql模式为strict模式
    max_connect_errors = 10000000 
    max_connections=100 # MysqL服务器支持的最大并发连接数
    back_log = 384 #back_log参数的值指出在MysqL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中. 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小.不同的操作系统在这个队列大小上有它自己的限制. 试图设定back_log高于你的操作系统的限制将是无效的.默认值为50.对于Linux系统推荐设置为小于512的整数. 
    query_cache_size=32 # 查询缓存大小,用于缓存SELECT查询结果
    read_buffer_size=4M #默认为64K,# 用于对MyISAM表全表扫描时使用的缓冲区大小.针对每个线程进行分配(前提是进行了全表扫描).进行排序查询时,MysqL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值.但MysqL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大.
    read_rnd_buffer_size=16M #默认为256K 
    key_buffer_size=54M # Key Buffer大小,用于缓存MyISAM表的索引块.决定数据库索引处理的速度(尤其是索引读)
    sort_buffer_size=32M #默认为256K,connection级参数(为每个线程配置),500个线程将消耗500*256K的sort_buffer_size
    join_buffer_size = 8M #联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享.
    skip-locking #避免MysqL的外部锁定,减少出错几率增强稳定性. 
    skip-name-resolve #禁止MysqL对外部连接进行DNS解析,使用这一选项可以消除MysqL进行DNS解析的时间.但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MysqL将无法正常处理连接请求! 
    skip-networking #开启该选项可以彻底关闭MysqL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MysqL数据库服务器则不要开启该选项!否则将无法正常连接! 
    table_cache=1024 #物理内存越大,设置就越大.默认为2402,调到512-1024最佳 
    table_open_cache = 256 # 设置table高速缓存的数量
    tmp_table_size=34M # 内存中的每个临时表允许的最大大小,默认为16M,调到64-256最挂
    thread_cache_size=120 #默认为60 缓存的最大线程数
    thread_concurrency = 8 #该参数取值为服务器逻辑cpu数量*2,在本例中,服务器有2颗物理cpu,而每颗物理cpu又支持H.T超线程,所以实际取值为4*2=8  
    # InnoDB相关参数
    innodb_additional_mem_pool_size=3M # InnoDB用于存储元数据信息的内存池大小,一般不需修改
    innodb_buffer_pool_size=105M # InnoDB使用缓冲池来缓存索引和行数据.该值设置的越大,则磁盘IO越少.一般将该值设为物理内存的80%.
    innodb_flush_log_at_trx_commit =1 # 事务相关参数,如果值为1,则InnoDB在每次commit都会将事务日志写入磁盘(磁盘IO消耗较大),这样保证了完全的ACID特性.而如果设置为0,则表示事务日志写入内存log和内存log写入磁盘的频率都为1次/秒.如果设为2则表示事务日志在每次commit都写入内存log,但内存log写入磁盘的频率为1次/秒.
    innodb_log_buffer_size=2M # InnoDB日志数据缓冲大小,如果缓冲满了,就会将缓冲中的日志数据写入磁盘(flush).由于一般至少都1秒钟会写一次磁盘,所以没必要设置过大,即使是长事务.
    innodb_log_file_size=53M # 每一个InnoDB事务日志的大小.一般设为innodb_buffer_pool_size的25%到100%
    innodb_thread_concurrency=9 # InnoDB内核最大并发线程数
    # MyISAM相关参数
    myisam_max_sort_file_size=100G # MysqL重建索引时允许使用的临时文件最大大小
    myisam_sort_buffer_size=68M

    MysqL教程配置说明:

    basedir = path 使用给定目录作为根目录(安装目录).
    character-sets-dir = path 给出存放着字符集的目录.
    datadir = path 从给定目录读取数据库文件.
    pid-file = filename 为MysqLd程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束MysqLd进程.
    socket = filename 为MysqL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/MysqL/MysqL.sock文件).在Windows环境下,如果MysqL客户与服务器是通过命名管道进行通信 的,Csock选项给出的将是该命名管道的名字(默认设置是MysqL).
    lower_case_table_name = 1/0 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母).

    MysqL教程MysqLd程序:语言设置

    MysqL教程MysqLd程序:通信、网络、信息安全

    enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信.这个命名管道的默认名字是MysqL,但可以用Csocket选项来改变.
    local-infile [=0] 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件.
    myisam-recover [=opt1,opt2,...] 在启动时自动修复所有受损的MyISAM数据表.这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同.
    old-passwords 使用MysqL 3.23和4.0版本中的老算法来加密MysqL数据库里的密码(默认使用MysqL 4.1版本开始引入的新加密算法).
    port = n 为MysqL程序指定一个TCP/IP通信端口(通常是3306端口).
    safe-user-create 只有在MysqL.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令).
    shared-memory 允许使用内存(shared memory)进行通信(仅适用于Windows).
    shared-memory-base-name = name 给共享内存块起一个名字(默认的名字是MysqL).
    skip-grant-tables 不使用MysqL数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库).
    skip-host-cache 不使用高速缓存区来存放主机名和IP地址的对应关系.
    skip-name-resovle 不把IP地址解析为主机名; 与访问控制(MysqL.user数据表)有关的检查全部通过IP地址行进.
    skip-networking 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接,不允许ICP/IP连接; 这提高了安全性,但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP).
    user = name MysqLd程序在启动后将在给定UNIX/Linux账户下执行; MysqLd必须从root账户启动才能在启动后切换到另一个账户下执行; MysqLd_safe脚本将默认使用Cuser=MysqL选项来启动MysqLd程序.

    MysqL教程MysqLd程序:内存管理、优化、查询缓存区

    bulk_insert_buffer_size = n 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M).
    key_buffer_size = n 用来存放索引区块的RMA值(默认设置是8M).
    join_buffer_size = n 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K).
    max_heap_table_size = n HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里.
    max_connections = n MysqL服务器同时处理的数据库连接的最大数量(默认设置是100).
    query_cache_limit = n 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M).
    query_cache_size = n 查询缓存区的最大长度(默认设置是0,不开辟查询缓存区).
    query_cache_type = 0/1/2 查询缓存区的工作模式:0,禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,”按需分配”模式,只响应SELECT sql_CACHE命令.
    read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用sql命令SET SESSION read_buffer_size = n命令加以改变.
    read_rnd_buffer_size = n 类似于read_buffer_size选项,但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K).
    sore_buffer = n 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小,则必须创建一个临时文件来进行排序.
    table_cache = n 同时打开的数据表的数量(默认设置是64).
    tmp_table_size = n 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件.

    MysqL教程MysqLd程序:日志

    log [= file] 把所有的连接以及所有的sql命令记入日志(通用查询日志); 如果没有给出file参数,MysqL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名).
    log-slow-queries [= file] 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数,MysqL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机 名).
    long_query_time = n 慢查询的执行用时上限(默认设置是10s).
    long_queries_not_using_indexs 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同Clog-slow-queries选项).
    log-bin [= filename] 把对数据进行修改的所有sql命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志,binary update log).这种日志的文件名是filename.n或默认的hostname.n,其中n是一个6位数字的整数(日志文件按顺序编号).
    log-bin-index = filename 二进制日志功能的索引文件名.在默认情况下,这个索引文件与二进制日志文件的名字相同,但后缀名是.index而不是.nnnnnn.
    max_binlog_size = n 二进制日志文件的最大长度(默认设置是1GB).在前一个二进制日志文件里的信息量超过这个最大长度之前,MysqL服务器会自动提供一个新的二进制日志文件接续上.
    binlog-do-db = dbname 只把给定数 据库里的变化情况记入二进制日志文件,其他数据库里的变化情况不记载.如果需要记载多个数据库里的变化情况,就必须在配置文件使用多个本选项来设置,每个数据库一行.
    binlog-ignore-db = dbname 不把给定数据库里的变化情况记入二进制日志文件.
    sync_binlog = n 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步).n=1是最安全的做法,但效率最低.默认设置是n=0,意思是由操作系统来负责二进制日志文件的同步工作.
    log-update [= file] 记载出错情况的日志文件名(出错日志).这种日志功能无法禁用.如果没有给出file参数,MysqL会使用hostname.err作为种日志文件的名字.

    MysqL教程MysqLd程序:镜像(主控镜像服务器)

    server-id = n 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能.
    log-bin = name 启用二进制日志功能.这种日志的文件名是filename.n或默认的hostname.n,其中的n是一个6位数字的整数(日志文件顺序编号).
    binlog-do/ignore-db = dbname 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件.

    MysqL教程MysqLd程序:镜像(从属镜像服务器)

    server-id = n 给服务器分配一个唯一的ID编号
    log-slave-updates 启用从属服务器上的日志功能,使这台计算机可以用来构成一个镜像链(A->B->C).
    master-host = hostname 主控服务器的主机名或IP地址.如果从属服务器上存在mater.info文件(镜像关系定义文件),它将忽略此选项.
    master-user = replicusername 从属服务器用来连接主控服务器的用户名.如果从属服务器上存在mater.info文件,它将忽略此选项.
    master-password = passwd 从属服务器用来连接主控服务器的密码.如果从属服务器上存在mater.info文件,它将忽略此选项.
    master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口).
    master-connect-retry = n 如果与主控服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s).如果从属服务器存在mater.info文件,它将忽略此选项.
    master-ssl-xxx = xxx 对主、从服务器之间的SSL通信进行配置.
    read-only = 0/1 0: 允许从属服务器独立地执行sql命令(默认设置); 1: 从属服务器只能执行来自主控服务器的sql命令.
    read-log-purge = 0/1 1: 把处理完的sql命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的sql命令立刻从中继日志文件里删除.
    replicate-do-table = dbname.tablename 与Creplicate-do-table选项的含义和用法相同,但数据库和数据库表名字里允许出现通配符”%” (例如: test%.%C对名字以”test”开头的所有数据库里的所以数据库表进行镜像处理).

    MysqL教程 

    replicate-do-db = name 只对这个数据库进行镜像处理.
    replicate-ignore-table = dbname.tablename 不对这个数据表进行镜像处理.
    replicate-wild-ignore-table = dbn.tablen 不对这些数据表进行镜像处理.
    replicate-ignore-db = dbname 不对这个数据库进行镜像处理.
    replicate-rewrite-db = db1name > db2name 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库.
    report-host = hostname 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关C主控服务器可以用这条命令生成一份从属服务器的名单.
    slave-compressed-protocol = 1 主、从服务器使用压缩格式进行通信C如果它们都支持这么做的话.
    slave-skip-errors = n1,n2,…或all 即使发生出错代码为n1、n2等的错误,镜像处理工作也继续进行(即不管发生什么错误,镜像处理工作也继续进行).如果配置得当,从属服务器不应 该在执行 sql命令时发生错误(在主控服务器上执行出错的sql命令不会被发送到从属服务器上做镜像处理); 如果不使用slave-skip-errors选项,从属服务器上的镜像工作就可能因为发生错误而中断,中断后需要有人工参与才能继续进行.

    MysqL教程MysqLdCInnoDB:基本设置、表空间文件

    skip-innodb 不加载InnoDB数据表驱动程序C如果用不着InnoDB数据表,可以用这个选项节省一些内存.
    innodb-file-per-table 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置).该选项始见于MysqL 4.1.
    innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300).如果使用了innodb-file-per-table选项并且需要同时打开很多数据表的话,这个数字很可能需要加大.
    innodb_data_home_dir = p InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径.在默认的情况下,这个主目录就是MysqL的数据目录.
    innodb_data_file_path = ts 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n).例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但允许它扩充到2GB.除文件名外,还可以用硬盘分区的设置名来定义表 空间,此时必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MysqL 4.0及更高版本的默认设置是ibdata1:10M:autoextend.
    innodb_autoextend_increment = n 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB).这个属性不涉及具体的数据表文件,那些文件的增大速度相对是比较小的.
    innodb_lock_wait_timeout = n 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务.这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义.这个选项的默认设置是50s.
    innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDB,默认设置是1,意思是不把缓存在INSERT缓存区的数据写入数据表,那些数据将在MysqL服务器下次启动 时再写入 (这么做没有什么风险,因为INSERT缓存区是表空间的一个组成部分,数据不会丢失).把这个选项设置为0反面危险,因为在计算机关闭时,InnoDB 驱动程序很可能没有足够的时间完成它的数据同步工作,操作系统也许会在它完成数据同步工作之前强行结束InnoDB,而这会导致数据不完整.

    MysqL教程MysqLd程序:InnoDBC日志

    innodb_log_group_home_dir = p 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等).在默认的情况下,InnoDB驱动程序将使用 MysqL数据目录作为自己保存日志文件的位置.
    innodb_log_files_in_group = n 使用多少个日志文件(默认设置是2).InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后,之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB).这个长度必须以MB(兆字节)或GB(千兆字节)为单 位进行设置.
    innodb_flush_log_at_trx_commit = 0/1/2 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上.设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步.
    innodb_flush_method = x InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统).这个选项的可取值有两种: fdatasync,用fsync()函数进行同步; O_DSYNC,用O_SYNC()函数进行同步.
    innodb_log_archive = 1 启用InnoDB驱动程序的archive(档案)日志功能,把日志信息写入ib_arch_log_n文件.启用这种日志功能在InnoDB与 MysqL一起使用时没有多大意义(启用MysqL服务器的二进制日志功能就足够用了).
     

    MysqL教程MysqLd程序CInnoDB:缓存区的设置和优化

    innodb_log_buffer_pool_size = n 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB).这个参数对速度有着相当大的影响,如果计算机上只运行有 MysqL/InnoDB数据库服务器,就应该把全部内存的80%用于这个用途.

    MysqL教程 

    innodb_log_buffer_size = n 事务日志文件写操作缓存区的最大长度(默认设置是1MB).
    innodb_additional_men_pool_size = n 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB).
    innodb_file_io_threads = n I/O操作(硬盘写操作)的最大线程个数(默认设置是4).
    innodb_thread_concurrency = n InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8).

    MysqL教程MysqLd程序:其它选项

    bind-address = ipaddr MysqL服务器的IP地址.如果MysqL服务器所在的计算机有多个IP地址,这个选项将非常重要.
    default-storage-engine = type 新数据表的默认数据表类型(默认设置是MyISAM).这项设置还可以通过Cdefault-table-type选项来设置.
    default-timezone = name 为MysqL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样).
    ft_min_word_len = n 全文索引的最小单词长度工.这个选项的默认设置是4,意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词.
    Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度,这个数字至少应该大于客户程序将要处理的最大BLOB块的长度.这个选项的默认设置是1MB.
    sql-mode = model1,mode2,… MysqL将运行在哪一种sql模式下.这个选项的作用是让MysqL与其他的数据库系统保持最大程度的兼容.这个选项的可取值包括ansi、db2、 oracle、no_zero_date、pipes_as_concat.

    MysqL教程ps:Linux系统安装PHP的MysqL扩展模块支持

    MysqL教程PHP Fatal error:  Call to undefined function MysqL_connect();

    MysqL教程在使用中出现了这个问题,查看了一下PHPinfo发现没有MysqL扩展.

    MysqL教程步骤如下:

    MysqL教程1 进入PHP的安装目录

    MysqL教程cd 到ext/MysqL
    /usr/local/bin/PHPize
    ./configure --with-PHP-config=/usr/local/bin/PHP-config --with-MysqL=/usr/local/MysqL/

    MysqL教程make

    MysqL教程make install

    MysqL教程在MysqL/modules下看到了MysqL.so

    MysqL教程2 修改PHP.ini

    MysqL教程 添加extensions = "MysqL.so"

    MysqL教程3 将MysqL.so拷贝到extension_dir目录下,extension_dir在PHP.ini中设置

    MysqL教程4重启apache就可以了.

    Mysql应用PHP中实现MySQL嵌套事务的两种解决方案

    Mysql应用PHP中实现MySQL嵌套事务的两种解决方案

    《MysqL应用PHP中实现MysqL嵌套事务的两种解决方案》要点:
    本文介绍了MysqL应用PHP中实现MysqL嵌套事务的两种解决方案,希望对您有用。如果有疑问,可以联系我们。

    MysqL学习一、问题起源

    MysqL学习在MysqL的官方文档中有明确的说明不支持嵌套事务:

    代码如下:

    Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START TRANSACTION statement or one of its synonyms.

    但是在我们开发一个复杂的系统时难免会无意中在事务中嵌套了事务,比如A函数调用了B函数,A函数使用了事务,并且是在事务中调用了B函数,B函数也有一个事务,这样就出现了事务嵌套.这时候其实A的事务就意义不大了,为什么呢?上面的文档中就有提到,简单的翻译过来就是:
    代码如下:

    当执行一个START TRANSACTION指令时,会隐式的执行一个commit操作.

    所以我们就要在系统架构层面来支持事务的嵌套.所幸的是在一些成熟的ORM框架中都做了对嵌套的支持,比如doctrine或者laravel.接下来我们就一起来看下这两个框架是怎样来实现的.

    MysqL学习友情提示,这两个框架的函数和变量的命名都比较的直观,虽然看起来很长,但是都是通过命名就能直接得知这个函数或者变量的意思,所以不要一看到那么一大坨就被吓到了 :)

    MysqL学习二、doctrine的办理方案

    MysqL学习首先来看下在doctrine中创建事务的代码(干掉了不相关的代码):

    代码如下:

    public function beginTransaction()
    {
        ++$this->_transactionnestingLevel;
        if ($this->_transactionnestingLevel == 1) {
            $this->_conn->beginTransaction();
        } else if ($this->_nestTransactionsWithSavepoints) {
            $this->createSavepoint($this->_getnestedTransactionSavePointName());
        }
    }

    这个函数的第一行用一个_transactionnestingLevel来标识当前嵌套的级别,如果是1,也就是还没有嵌套,那就用默认的办法执行一下START TRANSACTION就ok了,如果大于1,也就是有嵌套的时候,她会帮我们创建一个savepoint,这个savepoint可以理解为一个事务记录点,当需要回滚时可以只回滚到这个点.

    MysqL学习然后看下rollBack函数:

    代码如下:

    public function rollBack()
    {
        if ($this->_transactionnestingLevel == 0) {
            throw ConnectionException::noActiveTransaction();
        }

    MysqL学习    if ($this->_transactionnestingLevel == 1) {
            $this->_transactionnestingLevel = 0;
            $this->_conn->rollback();
            $this->_isRollbackOnly = false;
        } else if ($this->_nestTransactionsWithSavepoints) {
            $this->rollbackSavepoint($this->_getnestedTransactionSavePointName());
            --$this->_transactionnestingLevel;
        } else {
            $this->_isRollbackOnly = true;
            --$this->_transactionnestingLevel;
        }
    }


    可以看到处理的方式也很简单,如果level是1,直接rollback,否则就回滚到前面的savepoint.

    MysqL学习然后我们继续看下commit函数:

    代码如下:

    public function commit()
    {
        if ($this->_transactionnestingLevel == 0) {
            throw ConnectionException::noActiveTransaction();
        }
        if ($this->_isRollbackOnly) {
            throw ConnectionException::commitFailedRollbackOnly();
        }

    MysqL学习    if ($this->_transactionnestingLevel == 1) {
            $this->_conn->commit();
        } else if ($this->_nestTransactionsWithSavepoints) {
            $this->releaseSavepoint($this->_getnestedTransactionSavePointName());
        }

    MysqL学习    --$this->_transactionnestingLevel;
    }


    算了,不费口舌解释这段了吧 :)

    MysqL学习三、laravel的办理方案

    MysqL学习laravel的处理方式相对简单粗暴一些,我们先来看下创建事务的操作:

    代码如下:

    public function beginTransaction()
    {
        ++$this->transactions;

    MysqL学习    if ($this->transactions == 1)
        {
            $this->pdo->beginTransaction();
        }
    }


    感觉如何?so easy吧?先判断当前有几个事务,如果是第一个,ok,事务开始,否则就啥都不做,那么为啥是啥都不做呢?继续往下看rollBack的操作:
    代码如下:

    public function rollBack()
    {
        if ($this->transactions == 1)
        {
            $this->transactions = 0;

    MysqL学习        $this->pdo->rollBack();
        }
        else
        {
            --$this->transactions;
        }
    }


    明白了吧?只有当当前事务只有一个的时候才会真正的rollback,否则只是将计数做减一操作.这也就是为啥刚才说laravel的处理比较简单粗暴一些,在嵌套的内层里面实际上是木有真正的事务的,只有最外层一个整体的事务,虽然简单粗暴,但是也办理了在内层新建一个事务时会造成commit的问题.原理就是这个样子了,为了保持完整起见,把commit的代码也copy过来吧!
    代码如下:

    public function commit()
    {
        if ($this->transactions == 1) $this->pdo->commit();

    MysqL学习    --$this->transactions;
    }

    小编PHP培训学院每天发布《MysqL应用PHP中实现MysqL嵌套事务的两种解决方案》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。

    Mysql必读深入理解MySQL的数据库引擎的类型

    Mysql必读深入理解MySQL的数据库引擎的类型

    《MysqL必读深入理解MysqL的数据库引擎的类型》要点:
    本文介绍了MysqL必读深入理解MysqL的数据库引擎的类型,希望对您有用。如果有疑问,可以联系我们。

    你能用的数据库引擎取决于MysqL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MysqL.在缺省情况下,MysqL支持三个引擎:ISAM、MYISAM和HEAP.另外两种类型INNODB和BERKLEY(BDB),也常常可以使用.
      
    ISAM
    ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源.ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了.如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MysqL能够支持这样的备份应用程序.

    MYISAM
    MYISAM是MysqL的ISAM扩展格式和缺省的数据库引擎.除了提供ISAM里所没有的索引和字段管理的大量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作.其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间.MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具.

    MYISAM强调了快速读取操作,这可能就是为什么MysqL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作.所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式.

    HEAP
    HEAP允许只驻留在内存里的临时表格.驻留在内存使得HEAP比ISAM和MYISAM的速度都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失.在数据行被删除的时候,HEAP也不会浪费大量的空间,HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用.要记住,用完表格后要删除表格.

    INNODB和BERKLEYDB
    INNODB和BERKLEYDB(BDB)数据库引擎都是造就MysqL灵活性的技术的直接产品,这项技术就是MysqL++ API.在使用MysqL的时候,你所面对的每一个挑战几乎都源于ISAM和MYIASM数据库引擎不支持事务处理也不支持外来键.尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的.如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了.

    今天关于php – 嵌套MySQL的类别mysql嵌套语句的分享就到这里,希望大家有所收获,若想了解更多关于apache php mysql php生成mysql的数据字典、Mysql学习PHP MySQL的安装与配置详解、Mysql应用PHP中实现MySQL嵌套事务的两种解决方案、Mysql必读深入理解MySQL的数据库引擎的类型等相关知识,可以在本站进行查询。

    本文标签: