mysql 服务器端命令源码(一)

sql/sql_show.cc文件中实现

void mysqld_list_processes(THD *thd,const char *user, bool verbose)

{

  Item *field;

  List<Item> field_list;

  I_List<thread_info> thread_infos;

  ulong max_query_length= (verbose ? thd->variables.max_allowed_packet :

  PROCESS_LIST_WIDTH);

  Protocol *protocol= thd->protocol;

  DBUG_ENTER("mysqld_list_processes");


  field_list.push_back(new Item_int("Id", 0, MY_INT32_NUM_DECIMAL_DIGITS));

  field_list.push_back(new Item_empty_string("User",16));

  field_list.push_back(new Item_empty_string("Host",LIST_PROCESS_HOST_LEN));

  field_list.push_back(field=new Item_empty_string("db",NAME_CHAR_LEN));

  field->maybe_null=1;

  field_list.push_back(new Item_empty_string("Command",16));

  field_list.push_back(field= new Item_return_int("Time",7, MYSQL_TYPE_LONG));

  field->unsigned_flag= 0;

  field_list.push_back(field=new Item_empty_string("State",30));

  field->maybe_null=1;

  field_list.push_back(field=new Item_empty_string("Info",max_query_length));

  field->maybe_null=1;


=====?

三个步骤:

1.先定义id,user,Host,db,Command,Time,State,Info字段信息到field_list变量中,并通过protocol->send_fields发送到客户端


2. 锁定线程总数,遍历所有线程,将所有线程的信息填入thread_infos链表变量中


向客户端传送thread_infos链表中的数据,通过protocol->write()完成写操作



实际中遇到的问题:

      如果一个mysql线程很多,那么大部份的sleep线程将干扰查看processlist列表


你可能感兴趣的:(mysql,服务器,protocol,Field)