国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

directory search
目錄 前言 1. 一般信息 1.1. 關(guān)于本手冊 1.2. 本手冊采用的慣例 1.3. MySQL AB概述 1.4. MySQL數(shù)據(jù)庫管理系統(tǒng)概述 1.4.1. MySQL的歷史 1.4.2. MySQL的的主要特性 1.4.3. MySQL穩(wěn)定性 1.4.4. MySQL表最大能達(dá)到多少 1.4.5. 2000年兼容性 1.5. MaxDB數(shù)據(jù)庫管理系統(tǒng)概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的歷史 1.5.3. MaxDB的特性 1.5.4. 許可和支持 1.5.5. MaxDB和MySQL之間的特性差異 1.5.6. MaxDB和MySQL之間的協(xié)同性 1.5.7. 與MaxDB有關(guān)的鏈接 1.6. MySQL發(fā)展大事記 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL郵件列表 1.7.2. IRC(在線聊天系統(tǒng))上的MySQL社區(qū)支持 1.7.3. MySQL論壇上的MySQL社區(qū)支持 1.8. MySQL標(biāo)準(zhǔn)的兼容性 1.8.1. MySQL遵從的標(biāo)準(zhǔn)是什么 1.8.2. 選擇SQL模式 1.8.3. 在ANSI模式下運(yùn)行MySQL 1.8.4. MySQL對標(biāo)準(zhǔn)SQL的擴(kuò)展 1.8.5. MySQL與標(biāo)準(zhǔn)SQL的差別 1.8.6. MySQL處理約束的方式 2. 安裝MySQL 2.1. 一般安裝問題 2.1.1. MySQL支持的操作系統(tǒng) 2.1.2. 選擇要安裝的MySQL分發(fā)版 2.1.3. 怎樣獲得MySQL 2.1.4. 通過MD5校驗(yàn)和或GnuPG驗(yàn)證軟件包的完整性 2.1.5. 安裝布局 2.2. 使用二進(jìn)制分發(fā)版的標(biāo)準(zhǔn)MySQL安裝 2.3. 在Windows上安裝MySQL 2.3.1. Windows系統(tǒng)要求 2.3.2. 選擇安裝軟件包 2.3.3. 用自動安裝器安裝MySQL 2.3.4. 使用MySQL安裝向?qū)?/a> 2.3.5. 使用配置向?qū)?/a> 2.3.6. 通過非安裝Zip文件安裝MySQL 2.3.7. 提取安裝檔案文件 2.3.8. 創(chuàng)建選項(xiàng)文件 2.3.9. 選擇MySQL服務(wù)器類型 2.3.10. 首次啟動服務(wù)器 2.3.11. 從Windows命令行啟動MySQL 2.3.12. 以Windows服務(wù)方式啟動MySQL 2.3.13. 測試MySQL安裝 2.3.14. 在Windows環(huán)境下對MySQL安裝的故障診斷與排除 2.3.15. 在Windows下升級MySQL 2.3.16. Windows版MySQL同Unix版MySQL對比 2.4. 在Linux下安裝MySQL 2.5.在Mac OS X中安裝MySQL 2.6. 在NetWare中安裝MySQL 2.7. 在其它類Unix系統(tǒng)中安裝MySQL 2.8. 使用源碼分發(fā)版安裝MySQL 2.8.1. 源碼安裝概述 2.8.2. 典型配置選項(xiàng) 2.8.3. 從開發(fā)源碼樹安裝 2.8.4. 處理MySQL編譯問題 2.8.5. MIT-pthreads注意事項(xiàng) 2.8.6. 在Windows下從源碼安裝MySQL 2.8.7. 在Windows下編譯MySQL客戶端 2.9. 安裝后的設(shè)置和測試 2.9.1. Windows下安裝后的過程 2.9.2. Unix下安裝后的過程 2.9.3. 使初始MySQL賬戶安全 2.10. 升級MySQL 2.10.1. 從5.0版升級 2.10.2. 升級授權(quán)表 2.10.3. 將MySQL數(shù)據(jù)庫拷貝到另一臺機(jī)器 2.11. 降級MySQL 2.12. 具體操作系統(tǒng)相關(guān)的注意事項(xiàng) 2.12.1. Linux注意事項(xiàng) 2.12.2. Mac OS X注意事項(xiàng) 2.12.3. Solaris注意事項(xiàng) 2.12.4. BSD注意事項(xiàng) 2.12.5. 其它Unix注意事項(xiàng) 2.12.6. OS/2注意事項(xiàng) 2.13. Perl安裝注意事項(xiàng) 2.13.1. 在Unix中安裝Perl 2.13.2. 在Windows下安裝ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的問題 3. 教程 3.1. 連接與斷開服務(wù)器 3.2. 輸入查詢 3.3. 創(chuàng)建并使用數(shù)據(jù)庫 3.3.1. 創(chuàng)建并選擇數(shù)據(jù)庫 3.3.2. 創(chuàng)建表 3.3.3. 將數(shù)據(jù)裝入表中 3.3.4. 從表檢索信息 3.4. 獲得數(shù)據(jù)庫和表的信息 NoName 3.6. 常用查詢的例子 3.6.1. 列的最大值 3.6.2. 擁有某個列的最大值的行 3.6.3. 列的最大值:按組 3.6.4. 擁有某個字段的組間最大值的行 3.6.5. 使用用戶變量 3.6.6. 使用外鍵 3.6.7. 根據(jù)兩個鍵搜索 3.6.8. 根據(jù)天計算訪問量 3.6.9. 使用AUTO_INCREMENT 3.7. 孿生項(xiàng)目的查詢 3.7.1. 查找所有未分發(fā)的孿生項(xiàng) 3.7.2. 顯示孿生對狀態(tài)的表 3.8. 與Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 調(diào)用MySQL程序 4.3. 指定程序選項(xiàng) 4.3.1. 在命令行上使用選項(xiàng) 4.3.2. 使用選項(xiàng)文件 4.3.3. 用環(huán)境變量指定選項(xiàng) 4.3.4. 使用選項(xiàng)設(shè)置程序變量 5. 數(shù)據(jù)庫管理 5.1. MySQL服務(wù)器和服務(wù)器啟動腳本 5.1.1. 服務(wù)器端腳本和實(shí)用工具概述 5.1.2. mysqld-max擴(kuò)展MySQL服務(wù)器 5.1.3. mysqld_safe:MySQL服務(wù)器啟動腳本 5.1.4. mysql.server:MySQL服務(wù)器啟動腳本 5.1.5. mysqld_multi:管理多個MySQL服務(wù)器的程序 5.2. mysqlmanager:MySQL實(shí)例管理器 5.2.1. 用MySQL實(shí)例管理器啟動MySQL服務(wù)器 5.2.2. 連接到MySQL實(shí)例管理器并創(chuàng)建用戶賬戶 5.2.3. MySQL實(shí)例管理器命令行選項(xiàng) 5.2.4. MySQL實(shí)例管理器配置文件 5.2.5. MySQL實(shí)例管理器識別的命令 5.3. mysqld:MySQL服務(wù)器 5.3.1. mysqld命令行選項(xiàng) 5.3.2. SQL服務(wù)器模式 5.3.3. 服務(wù)器系統(tǒng)變量 5.3.4. 服務(wù)器狀態(tài)變量 5.4. mysql_fix_privilege_tables:升級MySQL系統(tǒng)表 5.5. MySQL服務(wù)器關(guān)機(jī)進(jìn)程 5.6. 一般安全問題 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻擊者面前保持安全 5.6.3. Mysqld安全相關(guān)啟動選項(xiàng) 5.6.4. LOAD DATA LOCAL安全問題 5.7. MySQL訪問權(quán)限系統(tǒng) 5.7.1. 權(quán)限系統(tǒng)的作用 5.7.2. 權(quán)限系統(tǒng)工作原理 5.7.3. MySQL提供的權(quán)限 5.7.4. 與MySQL服務(wù)器連接 5.7.5. 訪問控制 5.7.6. 訪問控制 5.7.7. 權(quán)限更改何時生效 5.7.8. 拒絕訪問錯誤的原因 5.7.9. MySQL 4.1中的密碼哈希處理 5.8. MySQL用戶賬戶管理 5.8.1. MySQL用戶名和密碼 5.8.2. 向MySQL增加新用戶賬戶 5.8.3. 從MySQL刪除用戶賬戶 5.8.4. 限制賬戶資源 5.8.5. 設(shè)置賬戶密碼 5.8.6. 使你的密碼安全 5.8.7. 使用安全連接 5.9. 備份與恢復(fù) 5.9.1. 數(shù)據(jù)庫備份 5.9.2. 示例用備份與恢復(fù)策略 5.9.3. 自動恢復(fù) 5.9.4. 表維護(hù)和崩潰恢復(fù) 5.9.5. myisamchk:MyISAM表維護(hù)實(shí)用工具 5.9.6. 建立表維護(hù)計劃 5.9.7. 獲取關(guān)于表的信息 5.10. MySQL本地化和國際應(yīng)用 5.10.1. 數(shù)據(jù)和排序用字符集 5.10.2. 設(shè)置錯誤消息語言 5.10.3. 添加新的字符集 5.10.4. 字符定義數(shù)組 5.10.5. 字符串比較支持 5.10.6. 多字節(jié)字符支持 5.10.7. 字符集問題 5.10.8. MySQL服務(wù)器時區(qū)支持 5.11. MySQL日志文件 5.11.1. 錯誤日志 5.11.2. 通用查詢?nèi)罩?/a> 5.11.3. 二進(jìn)制日志 5.11.4. 慢速查詢?nèi)罩?/a> 5.11.5. 日志文件維護(hù) 5.12. 在同一臺機(jī)器上運(yùn)行多個MySQL服務(wù)器 5.12.1. 在Windows下運(yùn)行多個服務(wù)器 5.12.2. 在Unix中運(yùn)行多個服務(wù)器 5.12.3. 在多服務(wù)器環(huán)境中使用客戶端程序 5.13. MySQL查詢高速緩沖 5.13.1. 查詢高速緩沖如何工作 5.13.2. 查詢高速緩沖SELECT選項(xiàng) 5.13.3. 查詢高速緩沖配置 5.13.4. 查詢高速緩沖狀態(tài)和維護(hù) 6. MySQL中的復(fù)制 6.1. 復(fù)制介紹 6.2. 復(fù)制實(shí)施概述 6.3. 復(fù)制實(shí)施細(xì)節(jié) 6.3.1. 復(fù)制主線程狀態(tài) 6.3.2. 復(fù)制從I/O線程狀態(tài) 6.3.3. 復(fù)制從SQL線程狀態(tài) 6.3.4. 復(fù)制傳遞和狀態(tài)文件 6.4. 如何設(shè)置復(fù)制 6.5. 不同MySQL版本之間的復(fù)制兼容性 6.6. 升級復(fù)制設(shè)置 6.6.1. 將復(fù)制升級到5.0版 6.7. 復(fù)制特性和已知問題 6.8. 復(fù)制啟動選項(xiàng) 6.9. 復(fù)制FAQ 6.10. 復(fù)制故障診斷與排除 6.11. 通報復(fù)制缺陷 6.12. 多服務(wù)器復(fù)制中的Auto-Increment 7. 優(yōu)化 7.1. 優(yōu)化概述 7.1.1. MySQL設(shè)計局限與折衷 7.1.2. 為可移植性設(shè)計應(yīng)用程序 7.1.3. 我們已將MySQL用在何處? 7.1.4. MySQL基準(zhǔn)套件 7.1.5. 使用自己的基準(zhǔn) 7.2. 優(yōu)化SELECT語句和其它查詢 7.2.1. EXPLAIN語法(獲取SELECT相關(guān)信息) 7.2.2. 估計查詢性能 7.2.3. SELECT查詢的速度 7.2.4. MySQL怎樣優(yōu)化WHERE子句 7.2.5. 范圍優(yōu)化 7.2.6. 索引合并優(yōu)化 7.2.7. MySQL如何優(yōu)化IS NULL 7.2.8. MySQL如何優(yōu)化DISTINCT 7.2.9. MySQL如何優(yōu)化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何優(yōu)化嵌套Join 7.2.11. MySQL如何簡化外部聯(lián)合 7.2.12. MySQL如何優(yōu)化ORDER BY 7.2.13. MySQL如何優(yōu)化GROUP BY 7.2.14. MySQL如何優(yōu)化LIMIT 7.2.15. 如何避免表掃描 7.2.16. INSERT語句的速度 7.2.17. UPDATE語句的速度 7.2.18. DELETE語句的速度 7.2.19. 其它優(yōu)化技巧 7.3. 鎖定事宜 7.3.1. 鎖定方法 7.3.2. 表鎖定事宜 7.4. 優(yōu)化數(shù)據(jù)庫結(jié)構(gòu) 7.4.1. 設(shè)計選擇 7.4.2. 使你的數(shù)據(jù)盡可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM鍵高速緩沖 7.4.7. MyISAM索引統(tǒng)計集合 7.4.8. MySQL如何計算打開的表 7.4.9. MySQL如何打開和關(guān)閉表 7.4.10. 在同一個數(shù)據(jù)庫中創(chuàng)建多個表的缺陷 7.5. 優(yōu)化MySQL服務(wù)器 7.5.1. 系統(tǒng)因素和啟動參數(shù)的調(diào)節(jié) 7.5.2. 調(diào)節(jié)服務(wù)器參數(shù) 7.5.3. 控制查詢優(yōu)化器的性能 7.5.4. 編譯和鏈接怎樣影響MySQL的速度 7.5.5. MySQL如何使用內(nèi)存 7.5.6. MySQL如何使用DNS 7.6. 磁盤事宜 7.6.1. 使用符號鏈接 8. 客戶端和實(shí)用工具程序 8.1. 客戶端腳本和實(shí)用工具概述 8.2. myisampack:生成壓縮、只讀MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 選項(xiàng) 8.3.2. mysql命令 8.3.3. 怎樣從文本文件執(zhí)行SQL語句 8.3.4. mysql技巧 8.4. mysqlaccess:用于檢查訪問權(quán)限的客戶端 8.5. mysqladmin:用于管理MySQL服務(wù)器的客戶端 8.6. mysqlbinlog:用于處理二進(jìn)制日志文件的實(shí)用工具 8.7. mysqlcheck:表維護(hù)和維修程序 8.8. mysqldump:數(shù)據(jù)庫備份程序 8.9. mysqlhotcopy:數(shù)據(jù)庫備份程序 8.10. mysqlimport:數(shù)據(jù)導(dǎo)入程序 8.11. mysqlshow-顯示數(shù)據(jù)庫、表和列信息 8.12. myisamlog:顯示MyISAM日志文件內(nèi)容 8.13. perror:解釋錯誤代碼 8.14. replace:字符串替換實(shí)用工具 8.15. mysql_zap:殺死符合某一模式的進(jìn)程 9. 語言結(jié)構(gòu) 9.1. 文字值 9.1.1. 字符串 9.1.2. 數(shù)值 9.1.3. 十六進(jìn)制值 9.1.4. 布爾值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 數(shù)據(jù)庫、表、索引、列和別名 9.2.1. 識別符限制條件 9.2.2. 識別符大小寫敏感性 9.3. 用戶變量 9.4. 系統(tǒng)變量 9.4.1. 結(jié)構(gòu)式系統(tǒng)變量 9.5. 注釋語法 9.6. MySQL中保留字的處理 10. 字符集支持 10.1. 常規(guī)字符集和校對 10.2. MySQL中的字符集和校對 10.3. 確定默認(rèn)字符集和校對 10.3.1. 服務(wù)器字符集和校對 10.3.2. 數(shù)據(jù)庫字符集和校對 10.3.3. 表字符集和校對 10.3.4. 列字符集和校對 10.3.5. 字符集和校對分配示例 10.3.6. 連接字符集和校對 10.3.7. 字符串文字字符集和校對 10.3.8. 在SQL語句中使用COLLATE 10.3.9. COLLATE子句優(yōu)先 10.3.10. BINARY操作符 10.3.11. 校對確定較為復(fù)雜的一些特殊情況 10.3.12. 校對必須適合字符集 10.3.13. 校對效果的示例 10.4. 字符集支持影響到的操作 10.4.1. 結(jié)果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW語句 10.5. Unicode支持 10.6. 用于元數(shù)據(jù)的UTF8 10.7. 與其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 國家特有字符集 10.10. MySQL支持的字符集和校對 10.10.1. Unicode字符集 10.10.2. 西歐字符集 10.10.3. 中歐字符集 10.10.4. 南歐與中東字符集 10.10.5. 波羅的海字符集 10.10.6. 西里爾字符集 10.10.7. 亞洲字符集 11. 列類型 11.1. 列類型概述 11.1.1. 數(shù)值類型概述 11.1.2. 日期和時間類型概述 11.1.3. 字符串類型概述 11.2. 數(shù)值類型 11.3. 日期和時間類型 11.3.1. DATETIME、DATE和TIMESTAMP類型 11.3.2. TIME類型 11.3.3. YEAR類型 11.3.4. Y2K事宜和日期類型 11.4. String類型 11.4.1. CHAR和VARCHAR類型 11.4.2. BINARY和VARBINARY類型 11.4.3. BLOB和TEXT類型 11.4.4. ENUM類型 11.4.5. SET類型 11.5. 列類型存儲需求 11.6. 選擇正確的列類型 11.7. 使用來自其他數(shù)據(jù)庫引擎的列類型 12. 函數(shù)和操作符 12.1. 操作符 12.1.1. 操作符優(yōu)先級 12.1.2. 圓括號 12.1.3. 比較函數(shù)和操作符 12.1.4. 邏輯操作符 12.2. 控制流程函數(shù) 12.3. 字符串函數(shù) 12.3.1. 字符串比較函數(shù) 12.4. 數(shù)值函數(shù) 12.4.1. 算術(shù)操作符 12.4.2. 數(shù)學(xué)函數(shù) 12.5. 日期和時間函數(shù) 12.6. MySQL使用什么日歷? 12.7. 全文搜索功能 12.7.1. 布爾全文搜索 12.7.2. 全文搜索帶查詢擴(kuò)展 12.7.3. 全文停止字 12.7.4. 全文限定條件 12.7.5. 微調(diào)MySQL全文搜索 12.8. Cast函數(shù)和操作符 12.9. 其他函數(shù) 12.9.1. 位函數(shù) 12.9.2. 加密函數(shù) 12.9.3. 信息函數(shù) 12.9.4. 其他函數(shù) NoName 12.10.1. GROUP BY(聚合)函數(shù) 12.10.2. GROUP BY修改程序 12.10.3. 具有隱含字段的GROUP BY 13. SQL語句語法 13.1. 數(shù)據(jù)定義語句 13.1.1. ALTER DATABASE語法 13.1.2. ALTER TABLE語法 13.1.3. CREATE DATABASE語法 13.1.4. CREATE INDEX語法 13.1.5. CREATE TABLE語法 13.1.6. DROP DATABASE語法 13.1.7. DROP INDEX語法 13.1.8. DROP TABLE語法 13.1.9. RENAME TABLE語法 13.2. 數(shù)據(jù)操作語句 13.2.1. DELETE語法 13.2.2. DO語法 13.2.3. HANDLER語法 13.2.4. INSERT語法 13.2.5. LOAD DATA INFILE語法 13.2.6. REPLACE語法 13.2.7. SELECT語法 13.2.8. Subquery語法 13.2.9. TRUNCATE語法 13.2.10. UPDATE語法 13.3. MySQL實(shí)用工具語句 13.3.1. DESCRIBE語法(獲取有關(guān)列的信息) 13.3.2. USE語法 13.4. MySQL事務(wù)處理和鎖定語句 13.4.1. START TRANSACTION 13.4.2. 不能回滾的語句 13.4.3. 會造成隱式提交的語句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT語法 13.4.5. LOCK TABLES和UNLOCK TABLES語法 13.4.6. SET TRANSACTION語法 13.4.7. XA事務(wù) 13.5. 數(shù)據(jù)庫管理語句 13.5.1. 賬戶管理語句 13.5.2. 表維護(hù)語句 13.5.3. SET語法 13.5.4. SHOW語法 13.5.5. 其它管理語句 13.6. 復(fù)制語句 13.6.1. 用于控制主服務(wù)器的SQL語句 13.6.2. 用于控制從服務(wù)器的SQL語句 13.7. 用于預(yù)處理語句的SQL語法 14. 插件式存儲引擎體系結(jié)構(gòu) 14.1. 前言 14.2. 概述 14.3. 公共MySQL數(shù)據(jù)庫服務(wù)器層 14.4. 選擇存儲引擎 14.5. 將存儲引擎指定給表 14.6. 存儲引擎和事務(wù) 14.7. 插入存儲引擎 14.8. 拔出存儲引擎 14.9. 插件式存儲器的安全含義 15. 存儲引擎和表類型 15.1. MyISAM存儲引擎 15.1.1. MyISAM啟動選項(xiàng) 15.1.2. 鍵所需的空間 15.1.3. MyISAM表的存儲格式 15.1.4. MyISAM表方面的問題 15.2. InnoDB存儲引擎 15.2.1. InnoDB概述 15.2.2. InnoDB聯(lián)系信息 15.2.3. InnoDB配置 15.2.4. InnoDB啟動選項(xiàng) 15.2.5. 創(chuàng)建InnoDB表空間 15.2.6. 創(chuàng)建InnoDB表 15.2.7. 添加和刪除InnoDB數(shù)據(jù)和日志文件 15.2.8. InnoDB數(shù)據(jù)庫的備份和恢復(fù) 15.2.9. 將InnoDB數(shù)據(jù)庫移到另一臺機(jī)器上 15.2.10. InnoDB事務(wù)模型和鎖定 15.2.11. InnoDB性能調(diào)節(jié)提示 15.2.12. 多版本的實(shí)施 15.2.13. 表和索引結(jié)構(gòu) 15.2.14. 文件空間管理和磁盤I/O 15.2.15. InnoDB錯誤處理 15.2.16. 對InnoDB表的限制 15.2.17. InnoDB故障診斷與排除 15.3. MERGE存儲引擎 15.3.1. MERGE表方面的問題 15.4. MEMORY (HEAP)存儲引擎 15.5. BDB (BerkeleyDB)存儲引擎 15.5.1. BDB支持的操作系統(tǒng) 15.5.2. 安裝BDB 15.5.3. BDB啟動選項(xiàng) 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 對BDB表的限制 15.5.7. 使用BDB表時可能出現(xiàn)的錯誤 15.6. EXAMPLE存儲引擎 15.7. FEDERATED存儲引擎 15.7.1. 安裝FEDERATED存儲引擎 15.7.2. FEDERATED存儲引擎介紹 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存儲引擎的局限性 15.8. ARCHIVE存儲引擎 15.9. CSV存儲引擎 15.10. BLACKHOLE存儲引擎 16. 編寫自定義存儲引擎 16.1. 前言 16.2. 概述 16.3. 創(chuàng)建存儲引擎源文件 NoName 16.5. 對處理程序進(jìn)行實(shí)例化處理 16.6. 定義表擴(kuò)展 16.7. 創(chuàng)建表 16.8. 打開表 16.9. 實(shí)施基本的表掃描功能 16.9.1. 實(shí)施store_lock()函數(shù) 16.9.2. 實(shí)施external_lock()函數(shù) 16.9.3. 實(shí)施rnd_init()函數(shù) 16.9.4. 實(shí)施info()函數(shù) 16.9.5. 實(shí)施extra()函數(shù) 16.9.6. 實(shí)施rnd_next()函數(shù) 16.10. 關(guān)閉表 NoName NoName NoName 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. MySQL簇 17.1. MySQL簇概述 17.2. MySQL簇的基本概念 17.3. 多計算機(jī)的簡單基礎(chǔ)知識 17.3.1. 硬件、軟件和聯(lián)網(wǎng) 17.3.2. 安裝 17.3.3. 配置 17.3.4. 首次啟動 17.3.5. 加載示例數(shù)據(jù)并執(zhí)行查詢 17.3.6. 安全關(guān)閉和重啟 17.4. MySQL簇的配置 17.4.1. 從源碼創(chuàng)建MySQL簇 17.4.2. 安裝軟件 17.4.3. MySQL簇的快速測試設(shè)置 17.4.4. 配置文件 17.5. MySQL簇中的進(jìn)程管理 17.5.1. 用于MySQL簇的MySQL服務(wù)器進(jìn)程使用 17.5.2. ndbd,存儲引擎節(jié)點(diǎn)進(jìn)程 17.5.3. ndb_mgmd,“管理服務(wù)器”進(jìn)程 17.5.4. ndb_mgm,“管理客戶端”進(jìn)程 17.5.5. 用于MySQL簇進(jìn)程的命令選項(xiàng) 17.6. MySQL簇的管理 17.6.1. MySQL簇的啟動階段 17.6.2. “管理客戶端”中的命令 17.6.3. MySQL簇中生成的事件報告 17.6.4. 單用戶模式 17.6.5. MySQL簇的聯(lián)機(jī)備份 17.7. 使用與MySQL簇的高速互連 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互連的影響 17.8. MySQL簇的已知限制 17.9. MySQL簇發(fā)展的重要?dú)v程 17.9.1. MySQL 5.0中的MySQL簇變化 17.9.2. 關(guān)于MySQL簇的MySQL 5.1發(fā)展歷程 17.10. MySQL簇常見問題解答 17.11. MySQL簇術(shù)語表 18. 分區(qū) 18.1. MySQL中的分區(qū)概述 18.2. 分區(qū)類型 18.2.1. RANGE分區(qū) 18.2.2. LIST分區(qū) 18.2.3. HASH分區(qū) 18.2.4. KEY分區(qū) 18.2.5. 子分區(qū) 18.2.6. MySQL分區(qū)處理NULL值的方式 18.3. 分區(qū)管理 18.3.1. RANGE和LIST分區(qū)的管理 18.3.2. HASH和KEY分區(qū)的管理 18.3.3. 分區(qū)維護(hù) 18.3.4. 獲取關(guān)于分區(qū)的信息 19. MySQL中的空間擴(kuò)展 19.1. 前言 19.2. OpenGIS幾何模型 19.2.1. Geometry類的層次 19.2.2. 類Geometry 19.2.3. 類Point 19.2.4. 類Curve 19.2.5. 類LineString 19.2.6. 類Surface 19.2.7. 類Polygon 19.2.8. 類GeometryCollection 19.2.9. 類MultiPoint 19.2.10. 類MultiCurve 19.2.11. 類MultiLineString 19.2.12. 類MultiSurface 19.2.13. 類MultiPolygon 19.3. 支持的空間數(shù)據(jù)格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二進(jìn)制(WKB)格式 19.4. 創(chuàng)建具備空間功能的MySQL數(shù)據(jù)庫 19.4.1. MySQL空間數(shù)據(jù)類型 19.4.2. 創(chuàng)建空間值 19.4.3. 創(chuàng)建空間列 19.4.4. 填充空間列 19.4.5. 獲取空間數(shù)據(jù) 19.5. 分析空間信息 19.5.1. Geometry格式轉(zhuǎn)換函數(shù) 19.5.2. Geometry函數(shù) 19.5.3. 從已有Geometry創(chuàng)建新Geometry的函數(shù) 19.5.4. 測試幾何對象間空間關(guān)系的函數(shù) 19.5.5. 關(guān)于幾何最小邊界矩形(MBR)的關(guān)系 19.5.6. 測試幾何類之間空間關(guān)系的函數(shù) 19.6. 優(yōu)化空間分析 19.6.1. 創(chuàng)建空間索引 19.6.2. 使用空間索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未實(shí)施的GIS特性 20. 存儲程序和函數(shù) 20.1. 存儲程序和授權(quán)表 20.2. 存儲程序的語法 20.2.1. CREATE PROCEDURE和CREATE FUNCTION 20.2.2. ALTER PROCEDURE和ALTER FUNCTION 20.2.3. DROP PROCEDURE和DROP FUNCTION 20.2.4.SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION 20.2.5.SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS 20.2.6. CALL語句 20.2.7. BEGIN ... END復(fù)合語句 20.2.8. DECLARE語句 20.2.9. 存儲程序中的變量 20.2.10. 條件和處理程序 20.2.11. 光標(biāo) 20.2.12. 流程控制構(gòu)造 20.3. 存儲程序、函數(shù)、觸發(fā)程序和復(fù)制:常見問題 20.4. 存儲子程序和觸發(fā)程序的二進(jìn)制日志功能 21. 觸發(fā)程序 21.1. CREATE TRIGGER語法 21.2. DROP TRIGGER語法 21.3. 使用觸發(fā)程序 22. 視圖 22.1. ALTER VIEW語法 22.2. CREATE VIEW語法 22.3. DROP VIEW語法 22.4. SHOW CREATE VIEW語法 23. INFORMATION_SCHEMA信息數(shù)據(jù)庫 23.1. INFORMATION_SCHEMA表 23.1.1. INFORMATION_SCHEMA SCHEMATA表 23.1.2. INFORMATION_SCHEMA TABLES表 23.1.3. INFORMATION_SCHEMA COLUMNS表 23.1.4. INFORMATION_SCHEMA STATISTICS表 23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表 23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表 23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表 23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表 23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表 23.1.10. INFORMATION_SCHEMA COLLATIONS表 23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表 23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表 23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表 23.1.14. INFORMATION_SCHEMA ROUTINES表 23.1.15. INFORMATION_SCHEMA VIEWS表 23.1.16. INFORMATION_SCHEMA TRIGGERS表 23.1.17. 其他INFORMATION_SCHEMA表 NoName 24. 精度數(shù)學(xué) 24.1. 數(shù)值的類型 24.2. DECIMAL數(shù)據(jù)類型更改 24.3. 表達(dá)式處理 24.4. 四舍五入 24.5. 精度數(shù)學(xué)示例 25. API和庫 25.1. libmysqld,嵌入式MySQL服務(wù)器庫 25.1.1. 嵌入式MySQL服務(wù)器庫概述 25.1.2. 使用libmysqld編譯程序 25.1.3. 使用嵌入式MySQL服務(wù)器時的限制 25.1.4. 與嵌入式服務(wù)器一起使用的選項(xiàng) 25.1.5. 嵌入式服務(wù)器中尚需完成的事項(xiàng)(TODO) 25.1.6. 嵌入式服務(wù)器示例 25.1.7. 嵌入式服務(wù)器的許可 25.2. MySQL C API 25.2.1. C API數(shù)據(jù)類型 25.2.2. C API函數(shù)概述 25.2.3. C API函數(shù)描述 25.2.4. C API預(yù)處理語句 25.2.5. C API預(yù)處理語句的數(shù)據(jù)類型 25.2.6. C API預(yù)處理語句函數(shù)概述 25.2.7. C API預(yù)處理語句函數(shù)描述 25.2.8. C API預(yù)處理語句方面的問題 25.2.9. 多查詢執(zhí)行的C API處理 25.2.10. 日期和時間值的C API處理 25.2.11. C API線程函數(shù)介紹 25.2.12. C API嵌入式服務(wù)器函數(shù)介紹 25.2.13. 使用C API時的常見問題 25.2.14. 創(chuàng)建客戶端程序 25.2.15. 如何生成線程式客戶端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常見問題 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序開發(fā)實(shí)用工具 25.9.1. msql2mysql:轉(zhuǎn)換mSQL程序以用于MySQL 25.9.2. mysql_config:獲取編譯客戶端的編譯選項(xiàng) 26. 連接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介紹 26.1.2. 關(guān)于ODBC和MyODBC的一般信息 26.1.3. 如何安裝MyODBC 26.1.4. 在Windows平臺上從二進(jìn)制版本安裝MyODBC 26.1.5. I在Unix平臺上從二進(jìn)制版本安裝MyODBC 26.1.6. 在Windows平臺上從源碼版本安裝MyODBC 26.1.7. 在Unix平臺上從源碼版本安裝MyODBC 26.1.8. 從BitKeeper開發(fā)源碼樹安裝MyODBC 26.1.9. MyODBC配置 26.1.10. 與MyODBC連接相關(guān)的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.1.13. MyODBC和第三方ODBC工具 26.1.14. MyODBC通用功能 26.1.15. 基本的MyODBC應(yīng)用步驟 26.1.16. MyODBC API引用 26.1.17. MyODBC數(shù)據(jù)類型 26.1.18. MyODBC錯誤代碼 26.1.19. MyODBC與VB:ADO、DAO和RDO 26.1.20. MyODBC與Microsoft.NET 26.1.21. 感謝 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下載并安裝MySQL Connector/NET 26.2.3. Connector/NET體系結(jié)構(gòu) 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET變更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安裝 Connector/J 26.3.3. JDBC引用 26.3.4. 與J2EE和其他Java框架一起使用 Connector/J 26.3.5. 診斷 Connector/J方面的問題 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平臺: 26.4.3. Junit測試要求 26.4.4. 運(yùn)行Junit測試 26.4.5. 作為JDBC驅(qū)動程序的一部分運(yùn)行 26.4.6. 在Java對象中運(yùn)行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)中運(yùn)行 26.4.9. 部署在標(biāo)準(zhǔn)的JMX代理環(huán)境下 (JBoss) 26.4.10. 安裝 27. 擴(kuò)展MySQL 27.1. MySQL內(nèi)部控件 27.1.1. MySQL線程 27.1.2. MySQL測試套件 27.2. 為MySQL添加新函數(shù) 27.2.1. 自定義函數(shù)接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION語法 27.2.3. 添加新的自定義函數(shù) 27.2.4. 添加新的固有函數(shù) 27.3. 為MySQL添加新步驟 27.3.1. 步驟分析 27.3.2. 編寫步驟 A. 問題和常見錯誤 A.1. 如何確定導(dǎo)致問題的原因 A.2. 使用MySQL程序時的常見錯誤 A.2.1. 拒絕訪問 A.2.2. 無法連接到[local] MySQL服務(wù)器 A.2.3. 客戶端不支持鑒定協(xié)議 A.2.4. 輸入密碼時出現(xiàn)密碼錯誤 NoName A.2.6. 連接數(shù)過多 A.2.7. 內(nèi)存溢出 A.2.8. MySQL服務(wù)器不可用 A.2.9. 信息包過大 A.2.10. 通信錯誤和失效連接 A.2.11. 表已滿 A.2.12. 無法創(chuàng)建文件/寫入文件 A.2.13. 命令不同步 A.2.14. 忽略用戶 A.2.15. 表tbl_name不存在 A.2.16. 無法初始化字符集 A.2.17. 文件未找到 A.3. 與安裝有關(guān)的事宜 A.3.1. 與MySQL客戶端庫的鏈接問題 A.3.2. 如何以普通用戶身份運(yùn)行MySQL A.3.3. 與文件許可有關(guān)的問題 A.4. 與管理有關(guān)的事宜 A.4.1. 如何復(fù)位根用戶密碼 A.4.2. 如果MySQL依然崩潰,應(yīng)作些什么 A.4.3. MySQL處理磁盤滿的方式 A.4.4. MySQL將臨時文件儲存在哪里 A.4.5. 如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 時區(qū)問題 A.5. 與查詢有關(guān)的事宜 A.5.1. 搜索中的大小寫敏感性 A.5.2. 使用DATE列方面的問題 A.5.3. 與NULL值有關(guān)的問題 A.5.4. 與列別名有關(guān)的問題 A.5.5. 非事務(wù)表回滾失敗 A.5.6. 從相關(guān)表刪除行 A.5.7. 解決與不匹配行有關(guān)的問題 A.5.8. 與浮點(diǎn)比較有關(guān)的問題 A.6. 與優(yōu)化器有關(guān)的事宜 A.7. 與表定義有關(guān)的事宜 A.7.1. 與ALTER TABLE有關(guān)的問題 A.7.2. 如何更改表中的列順序 A.7.3. TEMPORARY TABLE問題 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打開事宜 B. 錯誤代碼和消息 B.1. 服務(wù)器錯誤代碼和消息 B.2. 客戶端錯誤代碼和消息 C. 感謝 C.1. MySQL AB處的開發(fā)人 C.2. MySQL貢獻(xiàn)人 C.3. 資料員和譯員 C.4. MySQL使用和包含的庫 C.5. 支持MySQL的軟件包 C.6. 用于創(chuàng)建MySQL的工具 C.7. MySQL支持人員 D. MySQL變更史 D.1. 5.1.x版中的變更情況(開發(fā)) D.1.1. 5.1.2版中的變更情況(尚未發(fā)布) D.1.2. 5.1.1版中的變更情況(尚未發(fā)布) D.2. MyODBC的變更情況 D.2.1. MyODBC 3.51.12的變更情況 D.2.2. MyODBC 3.51.11的變更情況 E. 移植到其他系統(tǒng) E.1. 調(diào)試MySQL服務(wù)器 E.1.1. 針對調(diào)試編譯MySQL E.1.2. 創(chuàng)建跟蹤文件 E.1.3. 在gdb環(huán)境下調(diào)試mysqld E.1.4. 使用堆棧跟蹤 E.1.5. 使用日志文件找出mysqld中的錯誤原因 E.1.6. 如果出現(xiàn)表崩潰,請生成測試案例 E.2. 調(diào)試MySQL客戶端 E.3. DBUG軟件包 E.4. 關(guān)于RTS線程的注釋 E.5. 線程軟件包之間的差異 F. 環(huán)境變量 G. MySQL正則表達(dá)式 H. MySQL中的限制 H.1. 聯(lián)合的限制 I. 特性限制 I.1. 對存儲子程序和觸發(fā)程序的限制 I.2. 對服務(wù)器端光標(biāo)的限制 I.3. 對子查詢的限制 I.4. 對視圖的限制 I.5. 對XA事務(wù)的限制 J. GNU通用公共許可 K. MySQL FLOSS許可例外 索引
characters

第27章:擴(kuò)展MySQL

目錄

27.1. MySQL內(nèi)部控件
27.1.1. MySQL線程
27.1.2. MySQL測試套件
27.2. 為MySQL添加新函數(shù)
27.2.1. 自定義函數(shù)接口的特性
27.2.2. CREATE FUNCTION/DROP FUNCTION 語法
27.2.3. 添加新的自定義函數(shù)
27.2.4. 添加新的固有函數(shù)
27.3. 為MySQL添加新步驟
27.3.1. 步驟分析
27.3.2. 編寫步驟

27.1.?MySQL內(nèi)部控件

27.1.1. MySQL線程
27.1.2. MySQL測試套件

??? 本章包含許多在你處理MySQL代碼時需要了解的你事情。如果你想投入到MySQL的開發(fā)中,或想要接觸到最新的中間版本的代碼,或者就是想了解開發(fā)的進(jìn)度,請參閱2.8.3節(jié),“從開發(fā)源代碼樹安裝”的說明。如果你對MySQL的內(nèi)部插件感興趣,你也可以訂閱我們的內(nèi)部插件郵件列表。這個列表的流量相對低一些。欲知如何訂閱的詳情,請參閱1.7.1.1節(jié),“MySQL郵件列表”。在MySQL AB 的所有開發(fā)人員都在內(nèi)部插件列表里, 此外,我們幫助那些正在處理MySQL代碼的人。請隨意使用這個郵件列表來問代碼有關(guān)的問題,也可用它來發(fā)送你想奉獻(xiàn)給MySQL項(xiàng)目的 補(bǔ)?。?

27.1.1.?MySQL線程

??? MySQL服務(wù)器創(chuàng)建如下線程:

  • TCP/IP 連接線程處理所有連接請求,并為每一個連接創(chuàng)建一個新的專用線程來處理認(rèn)證和SQL查詢處理。

  • Windows NT 平臺上有一個名為管道處理程序(pipe handler)的線程,它和名為管道連接請求(pipe connect requests)的TCP/IP連接線程做同樣的工作。

  • 信號線程處理所有的信號,這個線程通常也處理報警和調(diào)用process_alarm() 函數(shù)來強(qiáng)制使得空閑時間太長的連接超時。

  • mysqld是與DUSE_ALARM_THREAD線程一起編譯的,這個專用線程是處理 創(chuàng)建的警報的。這個線程用在一些sigwait()函數(shù)有問題的系統(tǒng)上,或者用在你想在應(yīng)用程序中使用thr_alarm()代碼而不帶專用信號處理線程之時。

  • 若想使用flush_time=val選項(xiàng),會創(chuàng)建一個專用線程以給定的時間間隔刷新所有表格。

  • 每個連接都有它自己的線程。

  • 每個被使用INSERT DELAYED 的不同表格都會有自己的線程。

  • 若使用了master-host, 則會創(chuàng)建一個從屬的復(fù)制線程從主線程讀取并實(shí)施更新。

mysqladmin processlist 僅顯示連接,INSERT DELAYED, 及復(fù)制線程

27.1.2.?MySQL測試套件

27.1.2.1. 運(yùn)行MySQL測試套件
27.1.2.2. 擴(kuò)展MySQL測試套件
27.1.2.3. MySQL測試套件報告缺陷

???? 包含在Unix源碼和二進(jìn)制分發(fā)版中的測試系統(tǒng)可以讓用戶和開發(fā)人員對MySQL代碼施行回歸測試。這些測試可以在Unix上進(jìn)行,目前它們還不能在原生的Windows環(huán)境下進(jìn)行。

????? 當(dāng)前的測試案例套件不能在MySQL中測試所有東西,但是它能發(fā)現(xiàn)SQL處理代碼,OS/library文件中大多數(shù)明顯的缺陷,并且在測試復(fù)件方面也是非常徹底的。我們的終極目標(biāo)是對100%的代碼進(jìn)行測試。我們歡迎大家給我們的測試套件添加內(nèi)容。你可能會特別想貢獻(xiàn)出那些檢查你系統(tǒng)里功能性危機(jī)的測試,因?yàn)檫@將確保未來所有發(fā)行版的MySQL會與你的應(yīng)用程序一起更好地運(yùn)行。

27.1.2.1.?運(yùn)行MySQL測試套件

??? 測試系統(tǒng)包括一個測試語言解釋器(mysqltest),一個運(yùn)行所有測試的外殼腳本(mysql-test-run),用專用語言編寫的測試案例,以及它們的預(yù)期結(jié)果。在系統(tǒng)上編譯好之后,在源代碼的root下鍵入make test 或mysql-test/mysql-test-run。如果安裝了一個二進(jìn)制分發(fā)版, cd 到安裝root (如 /usr/local/mysql), 然后鍵入 scripts/mysql-test-run。所有測試應(yīng)該都通過,假使有沒通過的,若是一個MySQL里的缺陷,你可以試著找找是因?yàn)槭裁矗⑶覉蟾孢@個問題。請參閱27.1.2.3節(jié),“在MySQL測試套件里報告缺陷”。

如果你想要運(yùn)行測試套件的機(jī)器上已經(jīng)運(yùn)行了一個 mysqld ,只要它不占用9306 和 9307端口,就不用停掉它。如果占用了其中的一個,以可以編輯mysql-test-run把主端口和(或)從端口號改為其它可用的。.

可使用下面指令運(yùn)行單個測試案例 mysql-test/mysql-test-run test_name.

若一個測試未通過,你可以用--force選項(xiàng)來檢查運(yùn)行著的mysql-test-run看是否是別的測試未通過。

27.1.2.2.?擴(kuò)展MySQL測試套件

你可以用mysqltest 語言編寫你自己的測試案例。不幸地是,我們還沒有寫完相關(guān)方面完整地文檔。但是,你可以查看我們現(xiàn)有的測試案例,并將它們作為范例。下面幾點(diǎn)將有助于你入手:

  • 測試位于 mysql-test/t*.MYI,檢查所有的MyISAM表,并重啟mysqld。這樣,就能確保從干凈的狀態(tài)運(yùn)行服務(wù)器。請參見第5章:數(shù)據(jù)庫管理。

    使用“--log”選項(xiàng)啟動mysqld,并根據(jù)寫入日志的信息確定是否某些特殊的查詢殺死了服務(wù)器。約95%的缺陷與特定的查詢有關(guān)。正常情況下,這是服務(wù)器重啟前日志文件中最夠數(shù)個查詢中的1個。請參見5.11.2節(jié),“通用查詢?nèi)罩尽?。如果能夠用特殊查詢重?fù)殺死MySQL,即使在發(fā)出查詢前檢查了所有表的情況下也同樣,那么你就應(yīng)能確定缺陷,并應(yīng)提交關(guān)于該缺陷的缺陷報告。請參見1.7.1.3節(jié),“如何通報缺陷和問題”。

    嘗試提供一個測試范例,我們應(yīng)能利用該范例重復(fù)問題。請參見E.1.6節(jié),“如果出現(xiàn)表崩潰,請生成測試案例”。

    請在mysql-test目錄下并根據(jù)MySQL基準(zhǔn)進(jìn)行測試。請參見27.1.2節(jié),“MySQL測試套件”。它們能相當(dāng)良好地測試MySQL。你也可以為基準(zhǔn)測試增加代碼,以模擬你的應(yīng)用程序?;鶞?zhǔn)測試可在源碼分發(fā)版的sql-bench目錄下找到,對于二進(jìn)制分發(fā)版,可在MySQL安裝目錄下的sql-bench目錄下找到。

    嘗試使用fork_big.pl腳本(它位于源碼分發(fā)版的測試目錄下)。

    如果你將MySQL配置為調(diào)試模式,如果某事出錯,可更為容易地搜集關(guān)于可能錯誤的信息。如果將MySQL配置為調(diào)試模式,可生成1個安全的內(nèi)存分配程序,可使用它發(fā)現(xiàn)某些錯誤。此外,它還提供了很多輸出,這類輸出與出現(xiàn)的問題相關(guān)。在configure上使用“--with-debug”或“--with-debug=full”選項(xiàng)重新配置MySQL,然后再編譯它。請參見E.1節(jié),“調(diào)試MySQL服務(wù)器”。

    確保為你的操作系統(tǒng)應(yīng)用了最新的補(bǔ)丁。

    mysqld使用“--skip-external-locking”選項(xiàng)。在某些系統(tǒng)上,lockd鎖定管理器不能正確工作,--skip-external-locking”選項(xiàng)通知mysqld不使用外部鎖定。(這意味著,你不能在相同的數(shù)據(jù)目錄上運(yùn)行2mysqld服務(wù)器,如果使用myisamchk,必須謹(jǐn)慎。然而,嘗試將該選項(xiàng)用作測試也是有益的)。

    當(dāng)mysqld看上去正在運(yùn)行但并未響應(yīng)時,是否運(yùn)行了mysqladmin -u root processlist?某些時候,即使你認(rèn)為mysqld處于閑置狀態(tài)時,實(shí)際情況并非如此。問題可能是因?yàn)樗羞B接均已使用,或存在某些內(nèi)部鎖定問題。即使在該情況下,mysqladmin -u root processlist通常能夠進(jìn)行連接,并能提供關(guān)于當(dāng)前連接數(shù)以及其狀態(tài)的有用信息。

    在運(yùn)行其他查詢的同時,在單獨(dú)的窗口中運(yùn)行命令mysqladmin -i 5 statusmysqladmin -i 5 -r status,以生成統(tǒng)計信息。

    嘗試采用下述方法:

    gdb(或另一個調(diào)試器)啟動mysqld。請參見E.1.3節(jié),“在gdb環(huán)境下調(diào)試mysqld”。

    運(yùn)行測試腳本。

    3個較低層面上輸出backtrace(向后跟蹤)和局部變量。在gdb中,當(dāng)mysqldgdb內(nèi)崩潰時,可使用下述命令完成該任務(wù):

    backtrace
    info local
    up
    info local
    up
    info local

    使用gdb,你還能檢查與info線程共存的線程,并切換至特定的線程N,其中,N是線程ID。

    嘗試用Perl腳本模擬你的應(yīng)用程序,強(qiáng)制MySQL崩潰或行為異常。

    發(fā)送正常的缺陷報告。請參見1.7.1.3節(jié),“如何通報缺陷和問題”。應(yīng)比通常的報告更詳細(xì)。由于MySQL是為很多人提供服務(wù)的,它可能因僅存在于你的計算機(jī)上的某事崩潰(例如,與你的特定系統(tǒng)庫有關(guān)的錯誤)。

    如果你遇到與包含動態(tài)長度行的表有關(guān)的問題,而且你僅使用VARCHAR(而不是BLOBTEXT列),可嘗試用ALTER TABLE將所有VARCHAR列更改為CHAR列。這樣,就會強(qiáng)制MySQL使用固定大小的行。固定大小的行占用的空間略多,但對損壞的容忍度更高。

    目前的動態(tài)行代碼在MySQL AB已使用多年,很少遇到問題,但從本質(zhì)上看,動態(tài)長度行更傾向于出現(xiàn)錯誤,因此,不妨嘗試采用該策略以查看它是否有幫助,這不失為一個好主意。

    診斷問題時不要將你的服務(wù)器硬件排除在外。有缺陷的硬件能夠?qū)е聰?shù)據(jù)損壞。對硬件進(jìn)行故障診斷與排除操作時,尤其應(yīng)注意RAM和硬盤驅(qū)動器。

A.4.3.?MySQL處理磁盤滿的方式

在本節(jié)中,介紹了MySQL響應(yīng)磁盤滿錯誤的方式(如“設(shè)備上無剩余空間”),以及響應(yīng)超配額錯誤的方式(如“寫入失敗”或“達(dá)到了用戶屏蔽限制”)。

本節(jié)介紹的內(nèi)容與寫入MyISAM表有關(guān)。它也適用于寫入二進(jìn)制日志文件和二進(jìn)制索引文件,但對row”和“record”的應(yīng)用應(yīng)被視為“event”。

出現(xiàn)磁盤滿狀況時,MySQL將:

每分鐘檢查一次,查看是否有足夠空間寫入當(dāng)前行。如果有足夠空間,將繼續(xù),就像什么也未發(fā)生一樣。

10分鐘將1個條目寫入日志文件,提醒磁盤滿狀況。

為了減輕問題,可采取下述措施:

要想繼續(xù),僅需有足夠的磁盤空間以插入所有記錄。

要想放棄線程,必須使用mysqladmin kill。下次檢查磁盤時將放棄線程(1分鐘)。

其他線程可能會正在等待導(dǎo)致磁盤滿狀況的表。如果有數(shù)個“已鎖定”的線程,殺死正在磁盤滿狀況下等待的某一線程,以便允許其他線程繼續(xù)。

對前述行為的例外是,當(dāng)你使用REPAIR TABLEOPTIMIZE TABLE時,或當(dāng)索引是在LOAD DATA INFILEALTER TABLE語句后、在批操作中創(chuàng)建的。所有這些語句能創(chuàng)建大的臨時文件,如果保留這些文件,會導(dǎo)致系統(tǒng)其他部分出現(xiàn)大問題。如果在MySQL執(zhí)行這類操作的同時磁盤已滿,它將刪除大的臨時文件,并將表標(biāo)注為崩潰。但對于ALTER TABLE例外,舊表保持不變。

A.4.4.?MySQL將臨時文件儲存在哪里

MySQL使用環(huán)境變量TMPDIR的值作為保存臨時文件的目錄的路徑名。如果未設(shè)置TMPDIR,MySQL將使用系統(tǒng)的默認(rèn)值,通常為/tmp/var/tmp/usr/tmp。如果包含臨時文件目錄的文件系統(tǒng)過小,可對mysqld使用“—tmpdir”選項(xiàng),在具有足夠空間的文件系統(tǒng)內(nèi)指定1個目錄。

MySQL 5.1中,“—tmpdir”選項(xiàng)可被設(shè)置為數(shù)個路徑的列表,以循環(huán)方式使用。在Unix平臺上,路徑用冒號字符“:”隔開,在Windows、NetWareOS/2平臺上,路徑用分號字符“;”隔開。注意,為了有效分布負(fù)載,這些路徑應(yīng)位于不同的物理磁盤上,而不是位于相同磁盤的不同分區(qū)中。

如果MySQL服務(wù)器正作為復(fù)制從服務(wù)器使用,不應(yīng)將“--tmpdir”設(shè)置為指向基于內(nèi)存的文件系統(tǒng)的目錄,或當(dāng)服務(wù)器主機(jī)重啟時將清空的目錄。對于復(fù)制從服務(wù)器,需要在機(jī)器重啟時仍保留一些臨時文件,以便能夠復(fù)制臨時表或執(zhí)行LOAD DATA INFILE操作。如果在服務(wù)器重啟時丟失了臨時文件目錄下的文件,復(fù)制將失敗。

MySQL會以隱含方式創(chuàng)建所有的臨時文件。這樣,就能確保中止mysqld時會刪除所有臨時文件。使用隱含文件的缺點(diǎn)在于,在臨時文件目錄所在的位置中,看不到占用了文件系統(tǒng)的大臨時文件。

進(jìn)行排序時(ORDER BYGROUP BY),MySQL通常會使用1個或多個臨時文件。所需的最大磁盤空間由下述表達(dá)式?jīng)Q定:

(length of what is sorted + sizeof(row pointer))
* number of matched rows
* 2

row pointer”(行指針)的大小通常是4字節(jié),但在以后,對于大的表,該值可能會增加。

對于某些SELECT查詢,MySQL還會創(chuàng)建臨時SQL表。它們不是隱含表,并具有SQL_*形式的名稱。

ALTER TABLE會在與原始表目錄相同的目錄下創(chuàng)建臨時表。

A.4.5.?如何保護(hù)或更改MySQL套接字文件/tmp/mysql.sock

對于服務(wù)器用來與本地客戶端進(jìn)行通信的Unix套接字文件,其默認(rèn)位置是/tmp/mysql.sock。這有可能導(dǎo)致問題,原因在于,在某些版本的Unix上,任何人都能刪除/tmp目錄下的文件。

在大多數(shù)Unix版本中,可對/tmp目錄進(jìn)行保護(hù),使得文件只能被其所有這或超級用戶(根用戶)刪除。為此,以根用戶身份登錄,并使用下述命令在/tmp目錄上設(shè)置粘著位:

shell> chmod +t /tmp

通過執(zhí)行ls -ld /tmp,可檢查是否設(shè)置了粘著位。如果最后一個許可字符是“t”,表明設(shè)置了粘著位。

另一種方法是改變服務(wù)器創(chuàng)建Unix套接字文件的位置。如果進(jìn)行了這類操作,還應(yīng)讓客戶端程序知道文件的位置。能夠以多種不同方式指定文件位置:

在全局或局部選項(xiàng)文件中指定路徑。例如,將下述行置于文件/etc/my.cnf中:

[mysqld]
socket=/path/to/socket
?
[client]
socket=/path/to/socket

請參見4.3.2節(jié),“使用選項(xiàng)文件”。

在運(yùn)行客戶端程序時,在命令行上為mysqld_safe指定--socket”選項(xiàng)。

MYSQL_UNIX_PORT環(huán)境變量設(shè)置為Unix套接字文件的路徑。

重新從源碼編譯MySQL,以使用不同的默認(rèn)Unix套接字文件位置。運(yùn)行configure時,用“--with-unix-socket-path”選項(xiàng)定義文件路徑。請參見2.8.2節(jié),“典型配置選項(xiàng)”。

用下述命令連接服務(wù)器,能夠測試新的套接字位置是否工作:

shell> mysqladmin --socket=/path/to/socket version

A.4.6.?時區(qū)問題

如果遇到與SELECT NOW()有關(guān)的問題,它返回GMT值而不是當(dāng)?shù)貢r間,就應(yīng)通知服務(wù)器你的當(dāng)前失去。如果UNIX_TIMESTAMP()返回錯誤值,上述方式同樣適用。應(yīng)為服務(wù)器所運(yùn)行的環(huán)境進(jìn)行這類設(shè)置,例如,在mysqld_safemysql.server中。請參見附錄F:環(huán)境變量。

也可以對mysqld_safe使用“--timezone=timezone_name”選項(xiàng),為服務(wù)器設(shè)置失去。也可以在啟動mysqld之前,通過設(shè)置TZ環(huán)境變量完成該設(shè)置。

--timezone”或TZ的允許值與系統(tǒng)有關(guān)。關(guān)于可接受的值,請參見操作系統(tǒng)文檔。

A.5.?與查詢有關(guān)的事宜

A.5.1. 搜索中的大小寫敏感性
A.5.2. 使用DATE列方面的問題
A.5.3. 與NULL值有關(guān)的問題
A.5.4. 與列別名有關(guān)的問題
A.5.5. 非事務(wù)表回滾失敗
A.5.6. 從相關(guān)表刪除行
A.5.7. 解決與不匹配行有關(guān)的問題
A.5.8. 與浮點(diǎn)比較有關(guān)的問題

A.5.1.?搜索中的大小寫敏感性

在默認(rèn)情況下,MySQL搜索不區(qū)分大小寫(但某些字符集始終區(qū)分大小寫,如czech)。這意味著,如果你使用col_name LIKE 'a%'進(jìn)行搜索,你將獲得以Aa開始的所有列。如果打算使搜索區(qū)分大小寫,請確保操作數(shù)之一具有區(qū)分大小寫的或二進(jìn)制校對。例如,如果你正在比較均適用latin1字符集的列和字符串,可使用COLLATE操作符,使1個操作數(shù)具有latin1_general_cslatin1_bin校對特性。例如:

col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin

如果希望總是以區(qū)分大小寫的方式處理列,可使用區(qū)分大小寫的或二進(jìn)制校對聲明它。請參見13.1.5節(jié),“CREATE TABLE語法”。

簡單的比較操作(>=, >, =, <, <=, 排序和分組)基于每個字符的“排序值”。具有相同排序值的字符(如‘E, e,和‘??’)將被當(dāng)作相同的寫字符。

A.5.2.?使用DATE列方面的問題

DATE值的格式是'YYYY-MM-DD'。按照標(biāo)準(zhǔn)的SQL,不允許其他格式。在UPDATE表達(dá)式以及SELECT語句的WHERE子句中應(yīng)使用該格式。例如:

mysql> SELECT * FROM tbl_name WHERE date >= '2003-05-05';

為了方便,如果日期是在數(shù)值環(huán)境下使用的,MySQL會自動將日期轉(zhuǎn)換為數(shù)值(反之亦然)。它還具有相當(dāng)?shù)闹悄?,在更新時或在與TIMESTAMPDATEDATETIME列比較日期的WHERE子句中,允許寬松的字符串形式(寬松形式表示,任何標(biāo)點(diǎn)字符均能用作各部分之間的分隔符。例如,'2004-08-15''2004#08#15'是等同的)。MySQL還能轉(zhuǎn)換不含任何分隔符的字符串(如'20040815'),前體是它必須是有意義的日期。

使用<、<==、>=、>、或BETWEEN操作符將DATE、TIME、DATETIMETIMESTAMP與常量字符串進(jìn)行比較時,MySQL通常會將字符串轉(zhuǎn)換為內(nèi)部長整數(shù),以便進(jìn)行快速比較(以及略為“寬松”的字符串檢查)。但是,該轉(zhuǎn)換具有下述例外:

比較兩列時

DATE、TIME、DATETIMETIMESTAMP列與表達(dá)式進(jìn)行比較時

使用其他比較方法時,如INSTRCMP()。

對于這些例外情形,會將對象轉(zhuǎn)換為字符串并執(zhí)行字符串比較,采用該方式進(jìn)行比較。

為了保持安全,假定按字符串比較字符串,如果你打算比較臨時值和字符串,將使用恰當(dāng)?shù)淖址瘮?shù)。

對于特殊日期'0000-00-00',能夠以'0000-00-00'形式保存和檢索。在MyODBC中使用'0000-00-00'日期時,對于MyODBC 2.50.12或更高版本,該日期將被自動轉(zhuǎn)換為NULL,這是因?yàn)?span>ODBC不能處理這類日期。

由于MySQL能夠執(zhí)行前面所介紹的轉(zhuǎn)換,下述語句均能正常工作:

mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');
?
mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT MOD(idate,100) FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';

但是,下述語句不能正常工作:

mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'20030505')=0;

STRCMP()是一種字符串函數(shù),它能將idate轉(zhuǎn)換為'YYYY-MM-DD'格式的字符串,并執(zhí)行字符串比較。它不能將'20030505'轉(zhuǎn)換為日期'2003-05-05'并進(jìn)行日期比較。

如果你正在使用ALLOW_INVALID_DATES SQL模式,MySQL允許以僅執(zhí)行給定的有限檢查方式保存日期:MySQL僅保證天位于131的范圍內(nèi),月位于112的范圍內(nèi)。

這樣就使得MySQL很適合于Web應(yīng)用程序,其中,你能獲得三個不同字段中的年、月、日值,也能準(zhǔn)確保存用戶插入的值(無日期驗(yàn)證)。

如果未使用NO_ZERO_IN_DATE SQL模式,“天”和“月”部分可能為0。如果你打算將生日保存在DATE列而且僅知道部分日期,它十分方便。

如果未使用NO_ZERO_DATE SQL模式,MySQL也允許你將'0000-00-00'保存為“偽日期”。在某些情況下,它比使用NULL值更方便。

如果無法將日期轉(zhuǎn)換為任何合理值,“0”將保存在DATE列中,并被檢索為'0000-00-00'。這是兼顧速度和便利性的事宜。我們認(rèn)為,數(shù)據(jù)庫服務(wù)器的職責(zé)是檢索與你保存的日期相同的日期(即使在任何情況下,數(shù)據(jù)在邏輯上不正確也同樣)。我們認(rèn)為,對日期的檢查應(yīng)由應(yīng)用程序而不是服務(wù)器負(fù)責(zé)。

如果你希望MySQL檢查所有日期并僅接受合法日期(除非由IGNORE覆蓋),應(yīng)將sql_mode設(shè)置為"NO_ZERO_IN_DATE,NO_ZERO_DATE"。

A.5.3.?與NULL值有關(guān)的問題

對于SQL的新手,NULL值的概念常常會造成混淆,他們常認(rèn)為NULL是與空字符串''相同的事。情況并非如此。例如,下述語句是完全不同的:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

這兩條語句均會將值插入phone(電話)列,但第1條語句插入的是NULL值,第2條語句插入的是空字符串。第1種情況的含義可被解釋為“電話號碼未知”,而第2種情況的含義可被解釋為“該人員沒有電話,因此沒有電話號碼”。

為了進(jìn)行NULL處理,可使用IS NULLIS NOT NULL操作符以及IFNULL()函數(shù)。

SQL中,NULL與任何其它值的比較(即使是NULL)永遠(yuǎn)不會為“真”。包含NULL的表達(dá)式總是會導(dǎo)出NULL值,除非在關(guān)于操作符的文檔中以及表達(dá)式的函數(shù)中作了其他規(guī)定。下述示例中的所有列均返回NULL

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);

如果打算搜索列值為NULL的列,不能使用expr = NULL測試。下述語句不返回任何行,這是因?yàn)?,對于任何表達(dá)式,expr = NULL永遠(yuǎn)不為

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想查找NULL值,必須使用IS NULL測試。在下面的語句中,介紹了查找NULL電話號碼和空電話號碼的方式:

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';

更多信息和示例,請參見3.3.4.6節(jié),“使用NULL值”。

如果你正在使用MyISAMInnoDB、BDB、或MEMORY存儲引擎,能夠在可能具有NULL值的列上增加1條索引。如不然,必須聲明索引列為NOT NULL,而且不能將NULL插入到列中。

LOAD DATA INFILE讀取數(shù)據(jù)時,對于空的或丟失的列,將用''更新它們。如果希望在列中具有NULL值,應(yīng)在數(shù)據(jù)文件中使用\N。在某些情況下,也可以使用文字性單詞“NULL”。請參見13.2.5 LOAD DATA INFILE語法” 。

使用DISTINCT、GROUP BYORDER BY時,所有NULL值將被視為等同的。

使用ORDER BY時,首先將顯示NULL值,如果指定了DESC按降序排列,NULL值將最后顯示。

對于聚合(累計)函數(shù),如COUNT()、MIN()SUM(),將忽略NULL值。對此的例外是COUNT(*),它將計數(shù)行而不是單獨(dú)的列值。例如,下述語句產(chǎn)生兩個計數(shù)。首先計數(shù)表中的行數(shù),其次計數(shù)age列中的非NULL值數(shù)目:

mysql> SELECT COUNT(*), COUNT(age) FROM person;

對于某些列類型,MySQL將對NULL值進(jìn)行特殊處理。如果將NULL插入TIMESTAMP列,將插入當(dāng)前日期和時間。如果將NULL插入具有AUTO_INCREMENT屬性的整數(shù)列,將插入序列中的下一個編號。

A.5.4.?與列別名有關(guān)的問題

可以使用別名來引用GROUP BY、ORDER BYHAVING子句中的列。別名也能用于為列提供更好的名稱:
SELECT SQRT(a*b) AS root FROM tbl_name GROUP BY root HAVING root > 0;
SELECT id, COUNT(*) AS cnt FROM tbl_name GROUP BY id HAVING cnt > 0;
SELECT id AS 'Customer identity' FROM tbl_name;

標(biāo)準(zhǔn)SQL不允許在WHERE子句中已用列別名。這是因?yàn)椋瑘?zhí)行WHERE代碼時,可能尚未確定列值。例如,下述查詢是非法的:

SELECT id, COUNT(*) AS cnt FROM tbl_name WHERE cnt > 0 GROUP BY id;

執(zhí)行WHERE語句以確定哪些行應(yīng)被包含在GROUP BY部分中,而HAVING用于確定應(yīng)使用結(jié)果集中的哪些行。

A.5.5.?非事務(wù)表回滾失敗

執(zhí)行ROLLBACK(回滾)時,如果收到下述消息,表示事務(wù)中使用的1個或多個表不支持事務(wù):

警告:某些更改的非事務(wù)性表不能被回滾。

這些非事務(wù)性表不受ROLLBACK語句的影響。

如果在事務(wù)中意外地混合了事務(wù)性表和非事務(wù)性表,導(dǎo)致該消息的最可能原因是,你認(rèn)為本應(yīng)是事務(wù)性的表實(shí)際上不是。如你試圖使用mysqld服務(wù)器不支持的事務(wù)性存儲引擎(或用啟動選項(xiàng)禁止了它)創(chuàng)建表,就可能出現(xiàn)該情況。如果mysqld不支持存儲引擎,它將以MyISAM表創(chuàng)建表,這是非事務(wù)性表。

可使用下述語句之一檢查表的標(biāo)類型:

SHOW TABLE STATUS LIKE 'tbl_name';
SHOW CREATE TABLE tbl_name;

請參見13.5.4.18節(jié),“SHOW TABLE STATUS語法以及13.5.4.5節(jié),“SHOW CREATE TABLE語法”。

使用下述語句,可檢查mysqld服務(wù)器支持的存儲引擎:

SHOW ENGINES;

也可以使用下述語句,檢查與你感興趣的存儲引擎有關(guān)的變量值:

SHOW VARIABLES LIKE 'have_%';

例如,要想確定InnoDB存儲引擎是否可用,可檢查have_innodb變量的值。

請參見13.5.4.8節(jié),“SHOW ENGINES語法”和13.5.4.21節(jié),“SHOW VARIABLES語法”。

A.5.6.?從相關(guān)表刪除行

如果針對related_tableDELETE語句的總長度超過1MB(系統(tǒng)變量max_allowed_packet的默認(rèn)值),應(yīng)將其分為較小的部分,并執(zhí)行多個DELETE語句。如果related_column是索引列,為每條語句指定1001000related_column值,或許能獲得更快的DELETE速度。如果related_column不是索引列,速度與IN子句中的參量數(shù)目無關(guān)。

A.5.7.?解決與不匹配行有關(guān)的問題

如果有使用了很多表的復(fù)雜查詢,但未返回任何行,應(yīng)采用下述步驟找出什么出錯:

EXPLAIN測試查詢,以檢查是否發(fā)現(xiàn)某事顯然出錯。請參見7.2.1節(jié),“EXPLAIN語法(獲取關(guān)于SELECT的信息)”。

僅選擇在WHERE子句中使用的列。

從查詢中1次刪除1個表,直至返回了某些行為止。如果表很大,較好的主意是在查詢中使用LIMIT 10。

對于具有與上次從查詢中刪除的表匹配的行的列,發(fā)出SELECT查詢。

如果將FLOATDOUBLE列與具有數(shù)值類型的數(shù)值進(jìn)行比較,不能使用等式(=)比較。在大多數(shù)計算機(jī)語言中,該問題很常見,這是因?yàn)椋⒎撬械母↑c(diǎn)值均能以準(zhǔn)確的精度保存。在某些情況下,將FLOAT更改為DOUBLE可更正該問題。請參見A.5.8節(jié),“與浮點(diǎn)比較有關(guān)的問題”。

如果仍不能找出問題之所在,請創(chuàng)建能與顯示問題的“mysql test < query.sql”一起運(yùn)行的最小測試。通過使用mysqldump --quick db_name tbl_name_1 ... tbl_name_n > query.sql轉(zhuǎn)儲表,可創(chuàng)建測試文件。在編輯器中打開文件,刪除某些插入的行(如果有超出演示問題所需的行),并在文件末尾添加SELECT語句。

通過執(zhí)行下述命令,驗(yàn)證測試文件能演示問題:

shell> mysqladmin create test2
shell> mysql test2 < query.sql

使用mysqlbug將測試文件張貼到喲娜通用MySQL郵件列表。請參見1.7.1.1節(jié),“The MySQL郵件列表”。

A.5.8.?與浮點(diǎn)比較有關(guān)的問題

注意,下述部分主要與DOUBLEFLOAT列相關(guān),原因在于浮點(diǎn)數(shù)的不準(zhǔn)確本質(zhì)。MySQL使用64位十進(jìn)制數(shù)值的精度執(zhí)行DECIMAL操作,當(dāng)處理DECIMAL列時,應(yīng)能解決大多數(shù)常見的不準(zhǔn)確問題。

浮點(diǎn)數(shù)有時會導(dǎo)致混淆,這是因?yàn)樗鼈儫o法以準(zhǔn)確值保存在計算機(jī)體系結(jié)構(gòu)中。你在屏幕上所看到的值通常不是數(shù)值的準(zhǔn)確值。對于FLOATDOUBLE列類型,情況就是如此。DECIMAL列能保存具有準(zhǔn)確精度的值,這是因?yàn)樗鼈兪怯勺址硎镜摹?/span>

在下面的示例中,介紹了使用DOUBLE時的問題:

mysql> CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
mysql> INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
??? -> (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
??? -> (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
??? -> (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
??? -> (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
??? -> (6, 0.00, 0.00), (6, -51.40, 0.00);
?
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b
??? -> FROM t1 GROUP BY i HAVING a <> b;
?
+------+-------+------+
| i??? | a???? | b??? |
+------+-------+------+
| ???1 |? 21.4 | 21.4 |
|??? 2 |? 76.8 | 76.8 |
|??? 3 |?? 7.4 |? 7.4 |
|??? 4 |? 15.4 | 15.4 |
|??? 5 |?? 7.2 |? 7.2 |
|??? 6 | -51.4 |??? 0 |
+------+-------+------+

結(jié)果是正確的。盡管前5個記錄看上去不應(yīng)能進(jìn)行比較測試(ab的值看上去沒有什么不同),但它們能進(jìn)行比較,這是因?yàn)轱@示的數(shù)值間的差異在十分位左右,具體情況取決于計算機(jī)的體系結(jié)構(gòu)。

如果列d1d2定義為DECIMAL而不是DOUBLE,SELECT查詢的結(jié)果僅包含1行,即上面顯示的最后1行。

A.6.?與優(yōu)化器有關(guān)的事宜

MySQL采用了基于開銷的優(yōu)化器,以確定處理查詢的最解方式。在很多情況下,MySQL能夠計算最佳的可能查詢計劃,但在某些情況下,MySQL沒有關(guān)于數(shù)據(jù)的足夠信息,不得不就數(shù)據(jù)進(jìn)行“有教養(yǎng)”的估測。

當(dāng)MySQL未能做“正確的”事時,可使用下述工具來幫助MySQL

使用EXPLAIN語句獲取關(guān)于MySQL如何處理查詢的信息。要想使用它,可在SELECT語句前添加關(guān)鍵字EXPLAIN

mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;

關(guān)于EXPLAIN的詳細(xì)討論,請參見7.2.1節(jié),“EXPLAIN語法(獲取關(guān)于SELECT的信息)”。

使用ANALYZE TABLE tbl_name,為已掃描的表更新鍵分配。請參見13.5.2.1節(jié),“ANALYZE TABLE語法”。

為已掃描的表使用FORCE INDEX,通知MySQL:與使用給定的索引相比,表掃描開銷昂貴。請參見13.2.7節(jié),“SELECT語法”。

SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
WHERE t1.col_name=t2.col_name;

USE INDEXIGNORE INDEX也有一定的幫助。

關(guān)于全局和表級別的STRAIGHT_JOIN。請參見13.2.7節(jié),“SELECT語法”。

你可以調(diào)節(jié)全局或線程類系統(tǒng)變量。例如,用“--max-seeks-for-key=1000選項(xiàng)啟動mysqld,或使用“SET max_seeks_for_key=1000”來通知優(yōu)化器:假定任何表掃描均不會導(dǎo)致1000個以上的鍵搜索。請參見5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。

A.7.?與表定義有關(guān)的事宜

A.7.1. 與ALTER TABLE有關(guān)的問題
A.7.2. 如何更改表中的列順序
A.7.3. TEMPORARY TABLE問題

A.7.1.?與ALTER TABLE有關(guān)的問題

ALTER TABLE將表更改為當(dāng)前字符集。如果在執(zhí)行ALTER TABLE操作期間遇到重復(fù)鍵錯誤,原因在于新的字符集將2個鍵映射到了相同值,或是表已損壞。在后一種情況下,應(yīng)在表上運(yùn)行REPAIR TABLE。

如果ALTER TABLE失敗并給出下述錯誤,問題可能是因?yàn)樵?span>ALTER TABLE操作的早期階段出現(xiàn)MySQL崩潰,沒有名為A-xxxB-xxx的舊表:

Error on rename of './database/name.frm'
to './database/B-xxx.frm' (Errcode: 17)

在該情況下,進(jìn)入MySQL數(shù)據(jù)目錄,并刪除其名稱為以A-B-開始的所有文件(或許你希望將它們移動到其他地方而不是刪除它們)。

ALTER TABLE的工作方式如下:

  • 用請求的結(jié)構(gòu)變化創(chuàng)建名為A-xxx的新表。
  • 將所有行從原始表拷貝到A-xxx。
  • 將原始表重命名為B-xxx。
  • A-xxx重命名為原始表的名稱。
  • 刪除B-xxx。

如果在重命名操作中出錯,MySQL將嘗試撤銷更改。如果錯誤很嚴(yán)重(盡管這不應(yīng)出現(xiàn)),MySQL會將舊表保留為B-xxx。簡單地在系統(tǒng)級別上重命名表文件,應(yīng)能使數(shù)據(jù)復(fù)原。

如果在事務(wù)性表上使用ALTER TABLE,或正在使用WindowsOS/2操作系統(tǒng),如果已在表上執(zhí)行了LOCK TABLE操作,ALTER TABLE將對表執(zhí)行解鎖操作。這是因?yàn)?span>InnoDB和這類操作系統(tǒng)不能撤銷正在使用的表。

A.7.2.?如何更改表中的列順序

首先,請考慮是否的確需要更改表中的列順序。SQL的核心要點(diǎn)是從數(shù)據(jù)存儲格式獲取應(yīng)用??倯?yīng)指定檢索數(shù)據(jù)的順序。在下面的第1條語句中,以col_name1、col_name2col_name3順序返回列;在第2條語句中,以col_name1col_name3、col_name2順序返回列:

mysql> SELECT col_name1, col_name2, col_name3 FROM tbl_name;
mysql> SELECT col_name1, col_name3, col_name2 FROM tbl_name;

如果決定更改表列的順序,可執(zhí)行下述操作:

  1. 用具有新順序的列創(chuàng)建新表。
  2. 執(zhí)行該語句:
mysql> INSERT INTO new_table
??? -> SELECT columns-in-new-order FROM old_table;
  1. 撤銷或重命名old_table。
  2. 將新表重命名為原始名稱:
mysql> ALTER TABLE new_table RENAME old_table;

SELECT *十分適合于測試查詢。但是,在應(yīng)用程序中,永遠(yuǎn)不要依賴SELECT *的使用,不要依賴根據(jù)其位置檢索列。如果添加、移動或刪除了列,所返回的列的順序和位置不會保持相同。對表結(jié)構(gòu)的簡單更改也會導(dǎo)致應(yīng)用程序失敗。

A.7.3.?TEMPORARY TABLE問題

下面介紹了對使用TEMPORARY表的限制:

  • TEMPORARY表只能是HEAP、ISAM、MyISAMMERGE、或InnoDB類型。
  • 在相同的查詢中,不能引用TEMPORARY1次以上。例如,下例不能正常工作:
mysql> SELECT * FROM temp_table, temp_table AS t2;
錯誤1137:不能再次打開表:'temp_table'
  • SHOW TABLES語句不會列出TEMPORARY表。
  • 不能使用RENAME重命名TEMPORARY表。但能使用ALTER TABLE取而代之:
mysql> ALTER TABLE orig_name RENAME new_name;

A.8.?MySQL中的已知事宜

A.8.1. MySQL中的打開事宜

在本節(jié)中,列出了當(dāng)前MySQL版本中的已知事宜。

關(guān)于平臺相關(guān)事宜的更多信息,請參見2.12節(jié),“具體操作系統(tǒng)相關(guān)的注意事項(xiàng)”和附錄E:移植到其他系統(tǒng)中的安裝和移植說明。

A.8.1.?MySQL中的打開事宜

下面列出了已知問題,更正它們具有較高的優(yōu)先級:

  • 如果將NULL值與使用ALL/ANY/SOME的子查詢進(jìn)行比較,而且子查詢返回空的結(jié)果,比較操作會評估NULL的非標(biāo)準(zhǔn)結(jié)果而不是TRUEFALSE。在MySQL 5.1中將更正該問題。
  • 對于IN的線子查詢優(yōu)化不像“=”那樣有效。
  • 即使使用了lower_case_table_names=2(允許MySQL記住數(shù)據(jù)庫名和表名使用的大小寫),對于函數(shù)DATABASE()或在各種日志內(nèi)(在不區(qū)分大小寫的系統(tǒng)上),MySQL也不會記住數(shù)據(jù)庫名使用的大小寫情況。
  • 在復(fù)制操作中,撤銷FOREIGN KEY約束不工作,這是因?yàn)榧s束可能在從服務(wù)器上有另一個名稱。
  • REPLACE(以及具有REPLACE選項(xiàng)的LOAD DATA)不會觸發(fā)ON DELETE CASCADE。
  • 如果未使用所有列而且僅使用DISTINCT列表中的列,在GROUP_CONCAT()中,DISTINCT不能與ORDER BY一起工作。
  • 如果1位用戶擁有長時間運(yùn)行的事務(wù),而且另1位用戶撤銷了在事務(wù)中更新的某1表,那么在表用于事務(wù)本身之前,存在較小的機(jī)會,會在二進(jìn)制日志中包含DROP TABLE命令。我們計劃更正該問題,方法是讓DROP TABLE命令等待,直至表未在任何事務(wù)中使用為止。
  • 將大的整數(shù)值(介于2632641之間)插入數(shù)值或字符串列時,它將作為負(fù)值插入,這是因?yàn)樵摂?shù)值是在有符號整數(shù)環(huán)境下評估的。
  • 如果服務(wù)器運(yùn)行在不具備二進(jìn)制日志功能的條件下,FLUSH TABLES WITH READ LOCK不能屏蔽COMMIT,執(zhí)行完整備份時這可能會導(dǎo)致問題(表間的一致性問題)。
  • 在某些情況下,作用在BDB表上的ANALYZE TABLE會導(dǎo)致表不可用,直至重啟mysqld為止。如果出現(xiàn)該情況,請在MySQL錯誤文件中查找下述形式的錯誤:
001207 22:07:56? bdb:? log_flush: LSN past current end-of-log
  • 在所有事務(wù)完成之前,不要在BDB表(正在其上運(yùn)行多語句事務(wù))上執(zhí)行ALTER TABLE(可能會忽略事務(wù))。
  • 對于正在使用INSERT DELAYED的表,在其上執(zhí)行ANALYZE TABLE、OPTIMIZE TABLEREPAIR TABLE時,可能會導(dǎo)致問題。
  • 在表上執(zhí)行LOCK TABLE ...FLUSH TABLES ...時,不保證沒有完成一半的事務(wù)。
  • BDB打開的速度相對較慢。如果你在數(shù)據(jù)庫上有很多BDB表,如果未使用“-A”選項(xiàng)或正使用再混編功能,要想在數(shù)據(jù)庫上使用mysql客戶端,需要花費(fèi)較長的時間。當(dāng)你有大的表高速緩沖時,這點(diǎn)尤其明顯。
  • 復(fù)制功能采用了查詢級日志功能:主服務(wù)器將已執(zhí)行的查詢寫入二進(jìn)制日志。這是一種速度很快、簡潔和有效的記錄方法,在大多數(shù)情況下工作良好。

如果以特定的方式設(shè)計查詢,使得數(shù)據(jù)更改是非決定性(通常不推薦,即使在復(fù)制之外也同樣),主服務(wù)器和從服務(wù)器上的數(shù)據(jù)將變得不同。

例如:

  • 將0或NULL值插入AUTO_INCREMENT列中的CREATE ... SELECT或INSERT ... SELECT語句。
  • DELETE,如果從具有ON DELETE CASCADE屬性的外鍵的表中刪除行。
  • REPLACE ... SELECT、INSERT IGNORE ... SELECT,如果在插入的數(shù)據(jù)中具有重復(fù)鍵。

當(dāng)且僅當(dāng)前述查詢沒有保證決定行順序的ORDER BY子句時。

例如,對于不具有ORDER BYINSERT ... SELECT,SELECT可能會以不同的順序返回行(它會導(dǎo)致具有不同等級的行,從而導(dǎo)致AUTO_INCREMENT列中的不同數(shù)值),具體情況取決于優(yōu)化器在主服務(wù)器和從服務(wù)器上所作的選擇。

在主服務(wù)器和從服務(wù)器上,查詢將進(jìn)行不同的優(yōu)化,僅當(dāng):

  • 使用不同的存儲引擎在主服務(wù)器上而不是從服務(wù)器上保存表。(能夠在主服務(wù)器和從服務(wù)器上使用不同的存儲引擎。例如,如果從服務(wù)器具有較少的可用磁盤空間,可以在主服務(wù)器上使用InnoDB,但在 從服務(wù)器桑使用MyISAM)。
  • 在主服務(wù)器和從服務(wù)器上,MySQL緩沖區(qū)大小是不同的(key_buffer_size等)。
  • 在主服務(wù)器和從服務(wù)器上運(yùn)行不同的MySQL版本,版本間的優(yōu)化器代碼也不同。

該問題也會影響使用mysqlbinlog|mysql的數(shù)據(jù)庫恢復(fù)。

避免該問題的最簡單方法是,為前述的非決定性查詢增加ORDER BY子句,以確??偸且韵嗤捻樞虮4婊蚋男?。

在將來的MySQL版本中,需要時,我們將自動增加ORDER BY子句。

下面列出了已知的事宜,這些事宜將在恰當(dāng)?shù)臅r候更正:

  • 日志文件名基于服務(wù)器主機(jī)名(如果未使用啟動選項(xiàng)指定文件名的話)。如果更改了主機(jī)名,你將不得不使用諸如“--log-bin=old_host_name-bin”等選下美國。另一種選擇是重命名舊文件,以反映主機(jī)名變更情況(如果是二進(jìn)制日志,需要編輯二進(jìn)制日志索引文件,并更正binlog名稱)。請參見5.3.1節(jié),“mysqld命令行選項(xiàng)”。
  • Mysqlbinlog不刪除執(zhí)行LOAD DATA INFILE命令后遺留的臨時文件。請參見8.6節(jié),“mysqlbinlog:用于處理二進(jìn)制日志文件的實(shí)用工具”。
  • RENAME不能與TEMPORARY表一起工作,也不能與MERGE表中使用的表一起工作。
  • 由于表定義文件的保存方式,不能在表名、列名或枚舉中使用字符255CHAR(255))。按照安排,當(dāng)我們實(shí)施了新的表定義格式文件時,將在5.1版中更正該問題。
  • 使用SET CHARACTER SET時,不能在數(shù)據(jù)庫、表和列名中使用轉(zhuǎn)換的字符。
  • 不能在LIKE ... ESCAPE中與ESCAPE一起使用_’或‘%’。
  • 如果你有1DECIMAL列,其中,相同的數(shù)值以不同的格式保存(例如,+01.00、1.0001.00),GROUP BY可能會將每個值當(dāng)作不同的值。
  • 使用MIT-pthreads時,不能在另一個目錄下創(chuàng)建服務(wù)器。這是因?yàn)樗枰?span>MIT-pthreads,我們不太會更正該問題。請參見2.8.5 MIT-pthreads注意事項(xiàng)” 。
  • GROUP BYORDER BYDISTINCT中,不能可靠地使用BLOBTEXT值。在這類情況下,與BLOB值進(jìn)行比較時,僅使用最前的max_sort_length字節(jié)。max_sort_length的默認(rèn)值是1024,可在服務(wù)器啟動時或運(yùn)行時更改它。
  • 數(shù)值計算是使用BIGINTDOUBLE(正常情況下均為64位長)進(jìn)行的。你所能獲得的精度取決于函數(shù)。通用規(guī)則是位函數(shù)是按BIGINT精度執(zhí)行的,IFELT()是按BIGINTDOUBLE精度執(zhí)行的,其余的函數(shù)是按DOUBLE精度執(zhí)行的。對于除位字段外的其他數(shù),如果大于63位(9223372036854775807),應(yīng)避免使用無符號長long值。
  • 1個表中,最多能有255ENUMSET列。
  • MIN()、MAX()以及其他聚合函數(shù)中,MySQL目前會根據(jù)其字符串值比較ENUMSET列,而不是根據(jù)字符串在集合中的相對位置。
  • mysqld_safe會將來自mysqld的所有消息再定向到mysqld日志。與之相關(guān)的1個問題是,如果你執(zhí)行mysqladmin refresh關(guān)閉并再次打開日志,stdoutstderr仍會被重定向到舊的日志。如果你以廣義方式使用“--log”,應(yīng)編輯mysqld_safe以記錄到host_name.err而不是host_name.log,以便通過刪除它并執(zhí)行mysqladmin refresh,方便地收回為舊日志分配的空間。
  • UPDATE語句中,列從左向右更新。如果引用了已更新的列,你將得到更新值而不是原始值。例如,下述語句會將KEY增加2,而不是1
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
  • 你可以在相同查詢中引用多個臨時表,但不能引用任何給定的臨時表1次以上。例如,下述語句不能正常工作:
mysql> SELECT * FROM temp_table, temp_table AS t2;
錯誤1137:不能再次打開表:'temp_table'
  • 當(dāng)你在聯(lián)合操作中使用“隱含”列時,與未使用隱含列相比,優(yōu)化器將以不同的方式處理DISTINCT。在聯(lián)合操作中,隱含列將作為結(jié)果的組成部份計數(shù)(即使未顯示),但在正常查詢中,隱含列不參與DISTINCT比較。在以后,我們可能會更改該情況,在執(zhí)行DISTINCT時不比較隱含列。

例如:

SELECT DISTINCT mp3id FROM band_downloads
?????? WHERE userid = 9 ORDER BY id DESC;

以及

SELECT DISTINCT band_downloads.mp3id
?????? FROM band_downloads,band_mp3
?????? WHERE band_downloads.userid = 9
?????? AND band_mp3.id = band_downloads.mp3id
?????? ORDER BY band_downloads.id DESC;

在第2種情況下,使用MySQL服務(wù)器3.23.x,可在結(jié)果集中獲得2個等同行(這是因?yàn)?,隱藏ID列中的值可能不同)。

注意,在結(jié)果集中,僅對不含ORDER BY列的查詢才會出現(xiàn)該情況。

  • 如果在返回空集的查詢上執(zhí)行PROCEDURE,在某些情況下,PROCEDURE不轉(zhuǎn)換列。
  • 創(chuàng)建具有MERGE類型的表時,不檢查基本表是否具有兼容的類型。
  • 如果使用ALTER TABLEMERGE表中使用的表增加了UNIQUE索引,然后在MERGE表上增加了正常索引,如果在表中存在舊的、非UNIQUE鍵,對于這些表,鍵順序是不同的。這是因?yàn)椋?span>ALTER TABLE會將UNIQUE索引放在正常索引之前,以便能盡早檢測到重復(fù)的鍵。
?

這是MySQL參考手冊的翻譯版本,關(guān)于MySQL參考手冊,請訪問dev.mysql.com。原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。

Previous article: Next article: