文章列表
 
您正在查看 "Mysql" 分类下的文章

2009-04-30 9:08
   mysql中有一个explain 命令可以用来分析select 语句的运行效果,例如explain可以获得select语句
使用的索引情况、排序的情况等等。除此以外,explain 的extended 扩展能够在原本explain的基础
上额外的提供一些查询优化的信息,这些信息可以通过mysql的show warnings命令得到。下面是一个最简单的例子。
首先执行对想要分析的语句进行explain,并带上extended选项
mysql> explain extended select * from account\G;
*************************** 1. row ***************************
           id: 1
select_type: SIMPLE
        table: account
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra:
1 row in set, 1 warning (0.00 sec)

接下来再执行Show Warnings
mysql> show warnings\G;
*************************** 1. row ***************************
Level: Note
   Code: 1003
Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
1 row in set (0.00 sec)
从 show warnings的输出结果中我们可以看到原本的select * 被mysql优化成了
select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name`。
    explain extended 除了能够告诉我们mysql的查询优化能做什么,同时也能告诉我们mysql的
查询优化做不了什么。Mysql performanceExtended EXPLAIN这篇文中中作者就利用explain
extended +show warnings 找到了mysql查询优化器中不能查询优化的地方。
   从 EXPLAIN extended SELECT * FROM sbtest WHERE id>5 AND id>6 AND c="a" AND pad=c
语句的输出我们得知mysql的查询优化器不能将id>5 和 id>6 这两个查询条件优化合并成一个 id>6。

   在mysql performanceexplain extended文章中第三个例子和静室的explain的extended选项文章中,
两位作者也对explain extended做了进一步的实验,从这个两篇文中中我们可以得出结论是从
explain extend的输出中,我们可以看到sql的执行方式,对于分析sql还是很有帮助的。
下面特别摘抄了静室explain的extended选项这篇文章中的内容

/******************************以下代码和分析摘抄至静室explain的extended选项**************/
mysql>explain extended select * from t where a in (select b from i);
+----+--------------------+-------+------+
| id | select_type        | table | type |
+----+--------------------+-------+------+
| 1 | PRIMARY            | t     | ALL |
| 2 | DEPENDENT SUBQUERY | i     | ALL |
+----+--------------------+-------+------+
2 rows in set, 1 warning (0.01 sec)


子查询看起来和外部的查询没有任何关系,为什么MySQL显示的是DEPENDENT SUBQUERY,
和外部相关的查询呢?从explain extended的结果我们就可以看出原因了。


mysql>show warnings\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`
from `test`.`t` where
<in_optimizer>(`test`.`t`.`a`,
<exists>(select 1 AS `Not_used` from `test`.`i`
where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`)))
1 row in set (0.00 sec)


在这里MySQL改写了SQL,做了in的优化。
/******************************以上代码和分析摘抄至静室explain的extended选项*********************/
  
   不过需要注意的一点是从EXPLAIN extended +show warnings得到“优化以后”的查询语句
可能还不是最终优化执行的sql,或者说explain extended看到的信息还不足以说明mysql最
终对查询语句优化的结果。同样还是mysql formanceexplain Extended这篇文章的第二个
例子就说明了这种情况
/*****************************************************************************************************/
mysql> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5
   AND t2.k=t1.k;
+----+-------------+-------+-------+---------------+---------+---------+-------+-------+-------+
| id | select_type | TABLE | type | possible_keys | KEY     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+-------+-------+
| 1 | SIMPLE      | t1    | const | PRIMARY,k     | PRIMARY | 4       | const |     1 |       |
| 1 | SIMPLE      | t2    | ref   | k             | k       | 4       | const | 55561 |       |
+----+-------------+-------+-------+---------------+---------+---------+-------+-------+-------+
2 rows IN SET, 1 warning (0.00 sec)
     
mysql> SHOW warnings \G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1`
JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))
      1 row IN SET (0.00 sec)

/*************************************************************************************************/
   从Explain的结果中我们可以得到t1表的查询使用的是"const"类型,也就是说mysql查询的时候
会先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查询数据,很显然这样的查询优化结果没有在
接下来的Show Warings输出中找到。
总结
    还是引用静室explain的 extended选项这篇文章中的几句话"从explain extend的输出中,我们可以
看到sql的执行方式,对于分析sql还是很有帮助的"。

相关资源

mysql performance的 explain extended
静室的explain extended选项
mysql 参考手册中的EXPLAIN语法(获取SELECT相关信息)
 
2009-04-26 16:35

本文转载至 http://devdivision.blogspot.com/2009/03/top-83-mysql-performance-tips.html

MySQL is a widely used and fast SQL database server. It is a client/server implementation that consists of a server daemon (mysqld) and many different client programs/libraries.

You can check the same tips from here.Here is very useful tips for all mysql DBA's,Developers these tips are noted from MySQL Camp 2006 suggested by mysql community experts.

  1. Don't Index Everything
  2. Use benchmarking
  3. Minimize traffic by fetching only what you need.
    1. Paging/chunked data retrieval to limit
    2. Don't use SELECT *
    3. Be wary of lots of small quick queries if a longer query can be more efficient
  4. Use EXPLAIN to profile the query execution plan
  5. Use Slow Query Log (always have it on!)
  6. Don't use DISTINCT when you have or could use GROUP BY
  7. Use proper data partitions
    1. For Cluster. Start thinking about Cluster *before* you need them
  8. Insert performance
    1. Batch INSERT and REPLACE
    2. Use LOAD DATA instead of INSERT
  9. LIMIT m,n may not be as fast as it sounds
  10. Don't use ORDER BY RAND() if you have > ~2K records
  11. Use SQL_NO_CACHE when you are SELECTing frequently updated data or large sets of data
  12. avoid wildcards at the start of LIKE queries
  13. avoid correlated subqueries and in select and where clause (try to avoid in)
  14. config params --
  15. no calculated comparisons -- isolate indexed columns
  16. innodb_flush_commit=0 can help slave lag
  17. ORDER BY and LIMIT work best with equalities and covered indexes
  18. isolate workloads don't let administrative work interfere with customer performance. (ie backups)
  19. use optimistic locking, not pessimistic locking. try to use shared lock, not exclusive lock. share mode vs. FOR UPDATE
  20. use row-level instead of table-level locking for OLTP workloads
  21. Know your storage engines and what performs best for your needs, know that different ones exist.
    1. use MERGE tables ARCHIVE tables for logs
  22. Optimize for data types, use consistent data types. Use PROCEDURE ANALYSE() to help determine if you need less
  23. separate text/blobs from metadata, don't put text/blobs in results if you don't need them
  24. if you can, compress text/blobs
  25. compress static data
  26. don't back up static data as often
  27. derived tables (subqueries in the FROM clause) can be useful for retrieving BLOBs w/out sorting them. (self-join can speed up a query if 1st part finds the IDs and use it to fetch the rest)
  28. enable and increase the query and buffer caches if appropriate
  29. ALTER TABLE...ORDER BY can take chronological data and re-order it by a different field
  30. InnoDB ALWAYS keeps the primary key as part of each index, so do not make the primary key very large, be careful of redundant columns in an index, and this can make the query faster
  31. Do not duplicate indexes
  32. Utilize different storage engines on master/slave ie, if you need fulltext indexing on a table.
  33. BLACKHOLE engine and replication is much faster than FEDERATED tables for things like logs.
  34. Design sane query schemas. don't be afraid of table joins, often they are faster than denormalization
  35. Don't use boolean flags
  36. Use a clever key and ORDER BY instead of MAX
  37. Keep the database host as clean as possible. Do you really need a windowing system on that server?
  38. Utilize the strengths of the OS
  39. Hire a MySQL (tm) Certified DBA
  40. Know that there are many consulting companies out there that can help, as well as MySQL's Professional Services.
  41. Config variables & tips:
    1. use one of the supplied config files
    2. key_buffer, unix cache (leave some RAM free), per-connection variables, innodb memory variables
    3. be aware of global vs. per-connection variables
    4. check SHOW STATUS and SHOW VARIABLES (GLOBAL|SESSION in 5.0 and up)
    5. be aware of swapping esp. with Linux, "swappiness" (bypass OS filecache for innodb data files, innodb_flush_method=O_DIRECT if possible (this is also OS specific))
    6. defragment tables, rebuild indexes, do table maintenance
    7. If you use innodb_flush_txn_commit=1, use a battery-backed hardware cache write controller
    8. more RAM is good so faster disk speed
    9. use 64-bit architectures
  42. Know when to split a complex query and join smaller ones
  43. Debugging sucks, testing rocks!
  44. Delete small amounts at a time if you can
  45. Archive old data -- don't be a pack-rat! 2 common engines for this are ARCHIVE tables and MERGE tables
  46. use INET_ATON and INET_NTOA for IP addresses, not char or varchar
  47. make it a habit to REVERSE() email addresses, so you can easily search domains
  48. --skip-name-resolve
  49. increase myisam_sort_buffer_size to optimize large inserts (this is a per-connection variable)
  50. look up memory tuning parameter for on-insert caching
  51. increase temp table size in a data warehousing environment (default is 32Mb) so it doesn't write to disk (also constrained by max_heap_table_size, default 16Mb)
  52. Normalize first, and denormalize where appropriate.
  53. Databases are not spreadsheets, even though Access really really looks like one. Then again, Access isn't a real database
  54. In 5.1 BOOL/BIT NOT NULL type is 1 bit, in previous versions it's 1 byte.
  55. A NULL data type can take more room to store than NOT NULL
  56. Choose appropriate character sets & collations -- UTF16 will store each character in 2 bytes, whether it needs it or not, latin1 is faster than UTF8.
  57. make similar queries consistent so cache is used
  58. Have good SQL query standards
  59. Don't use deprecated features
  60. Use Triggers wisely
  61. Run in SQL_MODE=STRICT to help identify warnings
  62. Turning OR on multiple index fields (<5.0)>
  63. /tmp dir on battery-backed write cache
  64. consider battery-backed RAM for innodb logfiles
  65. use min_rows and max_rows to specify approximate data size so space can be pre-allocated and reference points can be calculated.
  66. as your data grows, indexing may change (cardinality and selectivity change). Structuring may want to change. Make your schema as modular as your code. Make your code able to scale. Plan and embrace change, and get developers to do the same.
  67. pare down cron scripts
  68. create a test environment
  69. try out a few schemas and storage engines in your test environment before picking one.
  70. Use HASH indexing for indexing across columns with similar data prefixes
  71. Use myisam_pack_keys for int data
  72. Don't use COUNT * on Innodb tables for every search, do it a few times and/or summary tables, or if you need it for the total # of rows, use SQL_CALC_FOUND_ROWS and SELECT FOUND_ROWS()
  73. use --safe-updates for client
  74. Redundant data is redundant
  75. Use INSERT ... ON DUPLICATE KEY update (INSERT IGNORE) to avoid having to SELECT
  76. use groupwise maximum instead of subqueries
  77. be able to change your schema without ruining functionality of your code
  78. source control schema and config files
  79. for LVM innodb backups, restore to a different instance of MySQL so Innodb can roll forward
  80. use multi_query if appropriate to reduce round-trips
  81. partition appropriately
  82. partition your database when you have real data
  83. segregate tables/databases that benefit from

相关资料

关于索引做的简单介绍

 
2009-04-09 12:24
MYSQL中提供了一个计算表达式性能的函数BENCHMARK
BENCHMARK(count,expr)

BENCHMARK会重复计算expr表达式count次,通过这种方式就可以评估出mysql执行这个expr表达式的效率。这个函数的返回值始终是0,但可以根据客户端提示的执行时间来得到BENCHMARK总共执行的所消耗的时间,如以下这个例子
mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+
| BENCHMARK(1000000,ENCODE('hello','goodbye')) |
+----------------------------------------------+
| 0 |
+----------------------------------------------+
1 row in set (4.74 sec)
上面例子中的4.74 秒指的是在mysql客户端总共消耗的时间。
BENCHMARK函数只能测量数字表达式(scalar expression)的性能,虽然说表达式可以是一个子查询,
但子查询返回的只能是单个值。在BENCHMARK(10, (SELECT * FROM t)) 这个语句中,如果t表有多列或是
t表中记录多于1行的话这个函数就会执行失败。BENCHMARK函数在执行多次的过程中sql的解析(parser)、
优化(optimizer)、锁表(table locking)等操作只会进行一次,只有运行评估(runtime evaluation)
会执行count次。 利用BENCHMARK,mysql就可以自动为我们多次执行表达式计算,从而获取比较平均的计算
结果。

参考资源
MySQLbenchmark函数
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_benchmark

相关链接
用PROCEDURE ANALYSE优化MYSQL表结构
Mysql中的文件排序(filesort)的含义
 
2009-03-29 20:33
PROCEDURE ANALYSE 通过分析select查询结果对现有的表的每一列给出优化的建议。
PROCEDURE ANALYSE的语法如下:
SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]])

max_elements (默认值256) analyze查找每一列不同值时所需关注的最大不同值的数量.
analyze还用这个值来检查优化的数据类型是否该是ENUM,如果该列的不同值的数量超过了
max_elements值ENUM就不做为建议优化的数据类型
max_memory (默认值8192) analyze查找每一列所有不同值时可能分配的最大的内存数量

样例程序
------------------------------------------------------------------------------------
mysql> DESC user_account;
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| USERID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| USERNAME | varchar(10) | NO | | NULL | |
| PASSSWORD | varchar(30) | NO | | NULL | |
| GROUPNAME | varchar(10) | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from user_account PROCEDURE ANALYSE(1)\G;
*************************** 1. row ***************************
Field_name: ibatis.user_account.USERID
Min_value: 1
Max_value: 103
Min_length: 1
Max_length: 3
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 51.7500
Std: 50.2562
Optimal_fieldtype: TINYINT(3) UNSIGNED NOT NULL
*************************** 2. row ***************************
Field_name: ibatis.user_account.USERNAME
Min_value: dfsa
Max_value: LMEADORS
.........................................................
---------------------------------------------------------------------------------------
从第一行输出我们可以看到analyze分析ibatis.user_account.USERID列最小值1,最大值103,最小长度1,
最大长度3...,并给出了改字段的优化建议:建议将该字段的数据类型改成TINYINT(3) UNSIGNED NOT NULL。

总结
从上面这个例子我们可以看出analyze能根据目前表中的数据情况给出优化建议。当数据库在生产环境运行
一定时间以后,开发或是DBA能参考analyze的分析结果来对表结构做出一定的优化。

参考资料
MYSQL REFERENCE-PROCEDURE ANALYSE

其他相关
Mysql中的文件排序(filesort)的含义

MYSQL的BENCHMARK函数

Making use of procedure analyse
 
2009-03-08 14:09
   很多人都知道mysql有一个explain 语句可以帮组开发人员分析某个select sql语句可能存在的执行计划已经可能存在的性能问题。explain的 Extra 输出中有两个经常出现的输出 Using temporary 和Using filesort,一直以来都没有搞清楚这两者的具体含义。mysql performance的新文章What does Using filesort mean in MySQL?给出了相应的解释。根据文章中的解释,文件排序(filesort)其实是比较失败的命名,一旦出现了不能利用索引来实现排序的情况都叫做文件排序(filesort),文件排序和文件(根据上下文应该是特指查询过程是否用到了临时文件)没有任何关系文件排序(filesort)应该叫做sort,它本质上是 quicksort。如果排序过程中使用的内存大于排序buffer,就每次排序其中的一部分,最后通过排序-合并来生成最后的排序结果。最后文章还提供了Sergey Petrunia How MySQL executes ORDER BY一文来帮助大家了解Mysql是如何执行order by的。

相关链接
用PROCEDURE ANALYSE优化MYSQL表结构
MYSQL的BENCHMARK函数
 
2009-01-08 18:38
一、使用readline快捷方式
mysql的命令行也使用了readline。下面整理一些常用的readline命令
快捷方式    说明   
Ctrl-b    左移一个字符   
Ctrl-f    右移一个字符   
Alt-b    左移一个词   
Alt-f    右移一个词   
Ctrl-a    移到行头   
Ctrl-b    移到行尾   
Ctrl-d    删除当前字符   
Ctrl-u    删除当前光标到行首   
Ctrl-k    删除当前光标到行尾   
Ctrl-w    删除当前光标的前面一个字   
Ctrl-y    粘贴之前删除的文字   
Ctrl-p    上一个命令   
Ctrl-n    下一个命令   
Ctrl-r    向前搜索命令记录   
Ctrl-s    向后搜索命令记录   
Ctrl-J    停止搜索命令记录   
Ctrl-G    停止搜索命令记录回复原始输入             
Ctrl-_    撤销最近的一次编辑命令
Ctrl-l    清屏,将当前行置顶

二、edit 或\e
在linux下 用edit或\e可以直接调出linux下的编辑器(Vi等)来编辑命令行的输入。这种模式对哪些比较复杂的sql语句尤其有使用价值,一方面省却了重复输入大段sql,另一方面可以使用编辑器上更为丰富的编辑命令来提高编辑效率。
 
2008-12-30 15:25
这是关于【MYSQL 客户端常用技巧】这组文章的第一篇,主要来源是参考了 http://phpadvent.org/2008/mysql-client-tips-by-ligaya-turmelle在第二篇中会介绍mysql客户端在linux环境下一些常用的命令和技巧。
1.
\G
指定输出以“竖排”的格式输出结果。通常的“横排”方式往往由于输出换行导致观察结果比较困难。例如
select * from   TABLES where TABLE_SCHEMA='cem_webtouch' limit 1的输出结果是
+---------------+--------------+--------------------------------+------------+--
------+---------+------------+------------+----------------+-------------+------
-----------+--------------+-----------+----------------+-------------+----------
---+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME                     | TABLE_TYPE | E
NGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_D
ATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TI
ME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------+--------------------------------+------------+--
------+---------+------------+------------+----------------+-------------+------
-----------+--------------+-----------+----------------+-------------+----------
---+------------+-----------------+----------+----------------+---------------+
| NULL          | cem_webtouch | boss_customer_account_site_map | VIEW       | N
ULL   |    NULL | NULL       |       NULL |           NULL |        NULL |
      NULL |         NULL |      NULL |           NULL | NULL        | NULL
   | NULL       | NULL            |     NULL | NULL           | VIEW          |

+---------------+--------------+--------------------------------+------------+--
------+---------+------------+------------+----------------+-------------+------
-----------+--------------+-----------+----------------+-------------+----------
---+------------+-----------------+----------+----------------+---------------+
1 row in set (0.03 sec)
如果用
select * from   TABLES where TABLE_SCHEMA='cem_webtouch' limit1 \G的输出结果是
*************************** 1. row ***************************
TABLE_CATALOG: NULL
   TABLE_SCHEMA: cem_webtouch
     TABLE_NAME: boss_customer_account_site_map
     TABLE_TYPE: VIEW
         ENGINE: NULL
        VERSION: NULL
     ROW_FORMAT: NULL
     TABLE_ROWS: NULL
AVG_ROW_LENGTH: NULL
    DATA_LENGTH: NULL
MAX_DATA_LENGTH: NULL
   INDEX_LENGTH: NULL
      DATA_FREE: NULL
AUTO_INCREMENT: NULL
    CREATE_TIME: NULL
    UPDATE_TIME: NULL
     CHECK_TIME: NULL
TABLE_COLLATION: NULL
       CHECKSUM: NULL
CREATE_OPTIONS: NULL
TABLE_COMMENT: VIEW
1 row in set (0.02 sec)
结果就清晰很多了:-)

2.\c 终止当前命令
打错命令是常用的事,\c可以用来帮你终止当前的输入,重新新的命令。例如下面这个例子
mysql> seleclt * from
    -> infomation_tables
    -> \c
mysql>
有时候输入的过程中会出现单引号不匹配的情况,直接\c是不能结束命令的,需要先用‘结束,然后再使用\c。仔细观察一下mysql客户端的提示符,当出现单引号不匹配的情况时,mysql客户端的提示符就变了了'>
mysql> seleclt * from
    -> table wher a='
    '> \c
    '> '
    -> \c
mysql>
3
tee and notee
tee用来定义讲mysql客户端的屏幕输出一并输出到到指定的文件中,这一点跟linux下的tee命令是一样的。
notee 顾名思义是停止这种输出。
mysql> TEE c:\output.txt   --把屏幕输出一并输出到c:\output.txt文件中
mysql> select * from tables; --这个命令的输出就会一并输出到
c:\output.txt文件
mysql> NOTEE --停止输出
注意
tee 可以用快捷方式\T来替换;notee用快捷方式\t来替换

4. help content
当你有记不住sql命令的时候还在通过msyql的online或offline的参考来查找资料吗。mysql 客户端内置的帮助命令或许可以帮你解燃眉之急。
mysql> help alter table
Name: 'ALTER TABLE'
Description:
Syntax:
ALTER [IGNORE] TABLE tbl_name
    alter_specification [, alter_specification] ...

alter_specification:
    ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
        PRIMARY KEY [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
        UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)
| ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
        FOREIGN KEY [index_name] (index_col_name,...)
        [reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
        [FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_option ...

ALTER TABLE enables you to change the structure of an existing table.
For example, you can add or delete columns, create or destroy indexes,
change the type of existing columns, or rename columns or the table
itself. You can also change the comment for the table and type of the
table.

 
 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

如果我想学习了解单元测试的话,我想知道我学到什么水平、或者说了哪些内容后才可以
 

按照这种操作,创建分支,点击ok后,提示access to 'http://xxxx/svn' forbidden,这
 

今天刚了解了这个设计原则,摊开来讲的话,博大精深
 

能详细阐述一下就好了
 

thx
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu